Как реализовать механизм обновления QTableWidget
Требуется сделать программу для хранения рейсов с данными по каждому. Для создании новой заметки вызывается второе окно. В него вводятся все нужные данные, и при нажатии на кнопку "Сохранить" в главном окне QTableWidget должен обновиться и показать новую запись, но он этого не делает. Весь день бился над решением проблемы, но так ни к чему и не пришел.
main.py
import sys
import sqlite3
from pathlib import Path
from sys import argv
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidgetItem, QLineEdit, QDateEdit
from addFlightNote import Ui_addFlightNote
from mainUI import Ui_MainWindow
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
script_dir = Path(argv[0]).parent.resolve()
db_path = script_dir / 'flightsDB.sqlite'
self.con = sqlite3.connect(db_path)
self.addNote.clicked.connect(self.openWindow)
self.deleteNote.clicked.connect(self.close)
self.updateTableButton.clicked.connect(self.selectData)
self.tableWidget.setSortingEnabled(True)
self.selectData()
def close(self):
self.close()
def openWindow(self):
DialogWindow = AddFlightNoteDialog()
DialogWindow.show()
DialogWindow.exec()
def selectData(self):
query = "SELECT departurePoint, departureDate, arrivalPoint, arrivalDate, price, downtime, driversFullName, " \
"driversSalary, driversDowntime, fuelConsumption, additionalExpenses FROM flights"
res = self.con.cursor().execute(query).fetchall()
title = ['Дата загрузки', 'Дата выгрузки', 'Точка загрузки', 'Точка выгрузки',
'Цена загрузки', 'Простой\nзагрузки', 'ФИО водителя', 'Зарплата\nводителя',
'Простой водителя', 'Траты на бензин', 'Дополнительные\nтраты']
self.tableWidget.setColumnCount(len(title))
self.tableWidget.setRowCount(0)
self.tableWidget.setHorizontalHeaderLabels(title)
for i, row in enumerate(res):
self.tableWidget.setRowCount(
self.tableWidget.rowCount() + 1)
for j, elem in enumerate(row):
self.tableWidget.setItem(
i, j, QTableWidgetItem(str(elem)))
self.tableWidget.resizeColumnsToContents()
class AddFlightNoteDialog(Ui_addFlightNote):
def __init__(self):
super().__init__()
self.setupUi(self)
self.acceptButton.clicked.connect(self.insertAndSaveNewNote)
self.rejectButton.clicked.connect(self.close)
script_dir = Path(argv[0]).parent.resolve()
db_path = script_dir / 'flightsDB.sqlite'
self.con = sqlite3.connect(db_path)
self.cur = self.con.cursor()
def insertAndSaveNewNote(self):
values = []
for row in range(self.gridLayout.rowCount()):
for col in range(self.gridLayout.columnCount()):
tempItem = self.gridLayout.itemAtPosition(row, col).widget()
# print(isinstance(tempItem, QLineEdit))
if isinstance(tempItem, QLineEdit):
values.append(tempItem.text())
elif isinstance(tempItem, QDateEdit):
values.append(tempItem.date().toString('dd.MM.yyyy'))
try:
values.append(int(values[1]) * 0.3)
except ValueError:
values.append('')
self.cur.execute(
"INSERT INTO flights (departureDate, downtime, arrivalDate, driversFullName, departurePoint, driversSalary, "
"arrivalPoint, fuelConsumption, price, additionalExpenses, driversDowntime) "
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
tuple(values)
)
self.con.commit()
self.close()
def except_hook(cls, exception, traceback):
sys.__excepthook__(cls, exception, traceback)
if __name__ == '__main__':
app = QApplication(sys.argv)
form = MainWindow()
form.setFixedSize(1540, 640)
form.show()
sys.excepthook = except_hook
sys.exit(app.exec())
mainUI
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'main.ui'
#
# Created by: PyQt5 UI code generator 5.15.6
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1540, 639)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.horizontalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
self.horizontalLayoutWidget.setGeometry(QtCore.QRect(20, 530, 1111, 81))
self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.addNote = QtWidgets.QPushButton(self.horizontalLayoutWidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.addNote.sizePolicy().hasHeightForWidth())
self.addNote.setSizePolicy(sizePolicy)
self.addNote.setObjectName("addNote")
self.horizontalLayout.addWidget(self.addNote)
self.editNote = QtWidgets.QPushButton(self.horizontalLayoutWidget)
self.editNote.setObjectName("editNote")
self.horizontalLayout.addWidget(self.editNote)
self.deleteNote = QtWidgets.QPushButton(self.horizontalLayoutWidget)
self.deleteNote.setEnabled(True)
self.deleteNote.setObjectName("deleteNote")
self.horizontalLayout.addWidget(self.deleteNote)
self.updateTableButton = QtWidgets.QPushButton(self.horizontalLayoutWidget)
self.updateTableButton.setObjectName("updateTableButton")
self.horizontalLayout.addWidget(self.updateTableButton)
self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget.setGeometry(QtCore.QRect(20, 20, 1341, 501))
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(0)
self.tableWidget.setRowCount(0)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1540, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.addNote.setText(_translate("MainWindow", "Добавить"))
self.editNote.setText(_translate("MainWindow", "Редактировать"))
self.deleteNote.setText(_translate("MainWindow", "Удалить"))
self.updateTableButton.setText(_translate("MainWindow", "Обновить таблицу"))
addFlightNote.py
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'addFlightNote.ui'
#
# Created by: PyQt5 UI code generator 5.15.6
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QDialog
class Ui_addFlightNote(QDialog):
def setupUi(self, addFlightNote):
addFlightNote.setObjectName("addFlightNote")
addFlightNote.resize(640, 480)
self.gridLayoutWidget = QtWidgets.QWidget(addFlightNote)
self.gridLayoutWidget.setGeometry(QtCore.QRect(20, 20, 601, 441))
self.gridLayoutWidget.setObjectName("gridLayoutWidget")
self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.setObjectName("gridLayout")
self.downtime = QtWidgets.QLabel(self.gridLayoutWidget)
self.downtime.setObjectName("downtime")
self.gridLayout.addWidget(self.downtime, 0, 1, 1, 1)
self.additionalExpensesEdit = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.additionalExpensesEdit.setObjectName("additionalExpensesEdit")
self.gridLayout.addWidget(self.additionalExpensesEdit, 9, 1, 1, 1)
self.departurePoint = QtWidgets.QLabel(self.gridLayoutWidget)
self.departurePoint.setObjectName("departurePoint")
self.gridLayout.addWidget(self.departurePoint, 4, 0, 1, 1)
self.arrivalPointEdit = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.arrivalPointEdit.setObjectName("arrivalPointEdit")
self.gridLayout.addWidget(self.arrivalPointEdit, 7, 0, 1, 1)
self.departurePointEdit = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.departurePointEdit.setObjectName("departurePointEdit")
self.gridLayout.addWidget(self.departurePointEdit, 5, 0, 1, 1)
self.arrivalDateEdit = QtWidgets.QDateEdit(self.gridLayoutWidget)
self.arrivalDateEdit.setObjectName("arrivalDateEdit")
self.gridLayout.addWidget(self.arrivalDateEdit, 3, 0, 1, 1)
self.arrivalDate = QtWidgets.QLabel(self.gridLayoutWidget)
self.arrivalDate.setObjectName("arrivalDate")
self.gridLayout.addWidget(self.arrivalDate, 2, 0, 1, 1)
self.priceEdit = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.priceEdit.setObjectName("priceEdit")
self.gridLayout.addWidget(self.priceEdit, 9, 0, 1, 1)
self.departureDateEdit = QtWidgets.QDateEdit(self.gridLayoutWidget)
self.departureDateEdit.setObjectName("departureDateEdit")
self.gridLayout.addWidget(self.departureDateEdit, 1, 0, 1, 1)
self.fuelConsumptionEdit = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.fuelConsumptionEdit.setObjectName("fuelConsumptionEdit")
self.gridLayout.addWidget(self.fuelConsumptionEdit, 7, 1, 1, 1)
self.fuelConsumption = QtWidgets.QLabel(self.gridLayoutWidget)
self.fuelConsumption.setObjectName("fuelConsumption")
self.gridLayout.addWidget(self.fuelConsumption, 6, 1, 1, 1)
self.departureDate = QtWidgets.QLabel(self.gridLayoutWidget)
self.departureDate.setObjectName("departureDate")
self.gridLayout.addWidget(self.departureDate, 0, 0, 1, 1)
self.driversSalary = QtWidgets.QLabel(self.gridLayoutWidget)
self.driversSalary.setObjectName("driversSalary")
self.gridLayout.addWidget(self.driversSalary, 4, 1, 1, 1)
self.driversFullNameEdit = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.driversFullNameEdit.setObjectName("driversFullNameEdit")
self.gridLayout.addWidget(self.driversFullNameEdit, 3, 1, 1, 1)
self.driversSalaryEdit = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.driversSalaryEdit.setObjectName("driversSalaryEdit")
self.gridLayout.addWidget(self.driversSalaryEdit, 5, 1, 1, 1)
self.price = QtWidgets.QLabel(self.gridLayoutWidget)
self.price.setObjectName("price")
self.gridLayout.addWidget(self.price, 8, 0, 1, 1)
self.additionalExpenses = QtWidgets.QLabel(self.gridLayoutWidget)
self.additionalExpenses.setObjectName("additionalExpenses")
self.gridLayout.addWidget(self.additionalExpenses, 8, 1, 1, 1)
self.arrivalPoint = QtWidgets.QLabel(self.gridLayoutWidget)
self.arrivalPoint.setObjectName("arrivalPoint")
self.gridLayout.addWidget(self.arrivalPoint, 6, 0, 1, 1)
self.driversFullName = QtWidgets.QLabel(self.gridLayoutWidget)
self.driversFullName.setObjectName("driversFullName")
self.gridLayout.addWidget(self.driversFullName, 2, 1, 1, 1)
self.downtimeEdit = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.downtimeEdit.setObjectName("downtimeEdit")
self.gridLayout.addWidget(self.downtimeEdit, 1, 1, 1, 1)
self.acceptButton = QtWidgets.QPushButton(self.gridLayoutWidget)
self.acceptButton.setObjectName("acceptButton")
self.gridLayout.addWidget(self.acceptButton, 10, 0, 1, 1)
self.rejectButton = QtWidgets.QPushButton(self.gridLayoutWidget)
self.rejectButton.setObjectName("rejectButton")
self.gridLayout.addWidget(self.rejectButton, 10, 1, 1, 1)
self.retranslateUi(addFlightNote)
QtCore.QMetaObject.connectSlotsByName(addFlightNote)
def retranslateUi(self, addFlightNote):
_translate = QtCore.QCoreApplication.translate
addFlightNote.setWindowTitle(_translate("addFlightNote", "Dialog"))
self.downtime.setText(_translate("addFlightNote", "Простой загрузки"))
self.departurePoint.setText(_translate("addFlightNote", "Точка загрузки"))
self.arrivalDate.setText(_translate("addFlightNote", "Дата выгрузки "))
self.fuelConsumption.setText(_translate("addFlightNote", "Топливо"))
self.departureDate.setText(_translate("addFlightNote", "Дата загрузки"))
self.driversSalary.setText(_translate("addFlightNote", "Зарплата водителя"))
self.price.setText(_translate("addFlightNote", "Цена загрузки"))
self.additionalExpenses.setText(_translate("addFlightNote", "Доп. траты"))
self.arrivalPoint.setText(_translate("addFlightNote", "Точка выгрузки"))
self.driversFullName.setText(_translate("addFlightNote", "ФИО водителя"))
self.acceptButton.setText(_translate("addFlightNote", "Сохранить"))
self.rejectButton.setText(_translate("addFlightNote", "Отмена"))