Ich fragte eine ähnliche Frage vor, aber das Ergebnis hat nicht funktioniert, und ich weiß nicht warum. Hier war der ursprüngliche Code:Wie bekomme ich Daten von QTableWidget, das Benutzer bearbeitet hat (Python mit PyQT)
def click_btn_printouts(self):
self.cur.execute("""SELECT s.FullName, m.PreviouslyMailed, m.nextMail, m.learnersDate, m.RestrictedDate, m.DefensiveDate FROM
StudentProfile s LEFT JOIN Mailouts m ON s.studentID=m.studentID""")
self.all_data = self.cur.fetchall()
self.search_results()
self.table.setRowCount(len(self.all_data))
self.tableFields = ["Check","Full name","Previously mailed?","Next mail","learnersDate","Restricted date","Defensive driving date"]
self.table.setColumnCount(len(self.tableFields))
self.table.setHorizontalHeaderLabels(self.tableFields)
self.checkbox_list = []
for i, self.item in enumerate(self.all_data):
FullName = QtGui.QTableWidgetItem(str(self.item[0]))
PreviouslyMailed = QtGui.QTableWidgetItem(str(self.item[1]))
LearnersDate = QtGui.QTableWidgetItem(str(self.item[2]))
RestrictedDate = QtGui.QTableWidgetItem(str(self.item[3]))
DefensiveDate = QtGui.QTableWidgetItem(str(self.item[4]))
NextMail = QtGui.QTableWidgetItem(str(self.item[5]))
self.table.setItem(i, 1, FullName)
self.table.setItem(i, 2, PreviouslyMailed)
self.table.setItem(i, 3, LearnersDate)
self.table.setItem(i, 4, RestrictedDate)
self.table.setItem(i, 5, DefensiveDate)
self.table.setItem(i, 6, NextMail)
chkBoxItem = QtGui.QTableWidgetItem()
chkBoxItem.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
chkBoxItem.setCheckState(QtCore.Qt.Unchecked)
self.checkbox_list.append(chkBoxItem)
self.table.setItem(i, 0, self.checkbox_list[i])
Der vorgeschlagene Code diese (Vertiefung genau) bis zum Ende der Funktion hinzuzufügen, war:
self.changed_items = set()
self.table.itemChanged.connect(self.log_change)
und fügen Sie die folgende Funktion:
def log_change(self):
self.changed_items.add(self.item)
print(self.item)
Der erwartete Druck war die bearbeitete Daten, aber was ich bekomme, sind die Daten, bevor es bearbeitet wurde.
Ich kann QTableView und QtSql nur verwenden, wenn ich einen Weg finden kann, es mit einer SQL-Abfrage zu verwenden, jeden ausgewählten Datensatz in eine Liste aufzunehmen und bestimmte Spalten daran zu hindern, bearbeitet zu werden. Wenn jemand weiß, wie man das macht, wäre das großartig, ich habe jetzt wirklich keine Zeit, die ganze Dokumentation selbst durchzugehen.
Alles, was ich tun möchte, ist der Benutzer in der Lage sein, Daten aus dem QTableWidget ändern und diese geänderten Daten als Datensatz erhalten.
Grundsätzlich ist mein Endziel, das Äquivalent von setEditStrategy(QSqlTableModel.OnManualSubmit)
für QTableWidget zu haben.
Ich habe versucht, dies für eine Weile jetzt herauszufinden, und ich will es nur aussortiert, es ist das letzte, was ich tun muss, um dieses Programm für einen Kunden zu beenden.
In der angenommenen Antwort in [der andere Beitrag] (http://stackoverflow.com/questions/39742199/how-do-i-get-the-information-that-the-user-haschanged-in- a-table-in-pyqt-with-p), sagte es 'def log_change (self, item):' 'self.changed_items.add (item)' während hier zitierst du '.add (self.item)' was ist natürlich anders. – ImportanceOfBeingErnest
Es sollte immer noch dasselbe sein. Ich habe den Artikel in self.item konvertiert, so dass er mit meinem Programm funktioniert. –
Der Grund, warum Sie die alten Daten erhalten, ist, dass Sie 'self.item' anstelle der Lösung aus der Antwort in Ihrem vorherigen Beitrag verwenden. – ImportanceOfBeingErnest