bin seit Kurzem von PyQt4 auf PyQt5 umgestiegen.
Meinen bisherigen PyQt4-Code habe ich auf PyQt5 versucht umzustellen.
Das hat mit Googeln, meist gut funktioniert.
Leider stehe ich vor dem Problem, Änderungen eines Datensatzes in QTableView zu aktualisieren.
Folgendes vorweg genommen.
Ich wähle einen Datensatz aus der Tabelle von QTableView aus, dieser wird dann in einem weiteren Fenster als Dataset geöffnet. Nach dem Schließen des Dataset-Fensters, sollen die Änderungen in der Tabelle von QTableView übernommen werden, was leider bei mir nicht funktioniert.
Deshalb, würde ich mich über Eure Hilfe freuen!
Ich poste hier mal den Code des Dataset-Fensters:
Code: Alles auswählen
import os
import sys
import operator # used for sorting
from PyQt5.QtCore import (Qt, QSize, QEvent, QObject,
QSortFilterProxyModel)
from PyQt5.QtGui import QStandardItem, QStandardItemModel
from PyQt5.QtWidgets import (QMainWindow, QMdiArea, QWidget, QMessageBox,
QTableView, QGridLayout, QApplication)
title = 'Backlight management'
header = ['Pos', 'Supplier', 'Artikel', 'Benennung']
mylist = [['001', 'Meyer', '47110', 'Bratwurst weiss, 125 g'],
['002', 'Meyer', '47111', 'Bratwurst weiss, 425 g'],
['003', 'Meyer', '47112', 'Bratwurst weiss, 1225 g']]
columnWidths = [20, 15, 20, 40]
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setWindowTitle("MDI demo")
self.mdi_area = QMdiArea()
self.setCentralWidget(self.mdi_area)
self.mylist = mylist
self.index = 0
sub = Dataset(self, mylist[self.index], header, columnWidths)
sub.setWindowTitle(title)
self.mdi_area.addSubWindow(sub)
sub.show()
class Dataset(QWidget):
def __init__(self, parent, dataset, header, columnWidths):
super(Dataset, self).__init__()
self.parent = parent
self.old_dataset = self.dataset = dataset
self.old_list = self.parent.mylist
self.header = header
try:
self.width = max(columnWidths)
except TypeError:
self.width = columnWidths
self.setObjectName('DATASET')
self.installEventFilter(self)
self.setFocusPolicy(Qt.StrongFocus)
self.view = QTableView(self)
# GridLayout
grid = QGridLayout()
grid.addWidget(self.view, 0, 0)
self.setLayout(grid)
self.model = QStandardItemModel()
# Load dataset
[self.model.invisibleRootItem().appendRow(
QStandardItem(column)) for column in self.dataset]
# Vertical header
[self.model.setHeaderData(i, Qt.Vertical, column)
for i, column in enumerate(header)]
self.proxy = QSortFilterProxyModel(self)
self.proxy.setSourceModel(self.model)
self.view.setModel(self.proxy)
def closeEvent(self, event):
self.exec_()
event.accept()
def exec_(self):
self.dataset = [self.model.invisibleRootItem().child(i).text()
for i in range(len(self.header))]
if self.dataset != self.old_dataset:
r = MessageBox(QMessageBox.Yes, 'Änderung speichern?')
if r.result() != QMessageBox.Yes:
self.dataset = self.old_dataset
else:
self.parent.mylist[self.parent.index] = self.dataset
print('self.dataset', self.dataset)
return self.parent.mylist
class MessageBox(QMessageBox):
def __init__(self, buttonReply, text):
QMessageBox.__init__(self)
self.setText(text)
if buttonReply == self.Ok:
self.setIcon(self.Warning)
self.setWindowTitle('Info')
self.setStandardButtons(self.Ok)
self.setEscapeButton(self.Cancel)
default = self.Cancel
elif buttonReply == self.Yes:
self.setIcon(self.Warning)
self.setWindowTitle('Question')
self.setStandardButtons(self.Yes | self.No)
default = self.No
elif buttonReply == self.Cancel:
self.setIcon(self.Question)
self.setWindowTitle('Question')
self.setStandardButtons(self.Yes | self.No | self.Cancel)
self.setEscapeButton(self.Cancel)
default = self.Cancel
elif buttonReply == self.Save:
self.setIcon(self.Question)
self.setWindowTitle('Save and Exit')
self.setStandardButtons(self.Save | self.Discard | self.Cancel)
self.setInformativeText('Änderung speichern?')
self.setEscapeButton(self.Cancel)
default = self.Cancel
self.setDefaultButton(default)
self.exec_()
def main():
app = QApplication(sys.argv)
ex = MainWindow()
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()