2016-10-02 1 views
0

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.

+0

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

+0

Es sollte immer noch dasselbe sein. Ich habe den Artikel in self.item konvertiert, so dass er mit meinem Programm funktioniert. –

+0

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

Antwort

1

Es ist immer schwierig, ohne ein minimales Arbeitsbeispiel zu antworten, also habe ich selbst einen erstellt und den Vorschlag aus der other post in, ändern, so dass es den Text des geänderten Artikels und seine Position innerhalb der Tabelle ausgibt.

# runs with Python 2.7 and PyQt4 
from PyQt4 import QtGui, QtCore 
import sys 


class App(QtGui.QMainWindow): 

    def __init__(self, parent=None): 
     super(App, self).__init__(parent) 
     self.setMinimumSize(600,200) 

     self.all_data = [["John", True, "", 24], 
         ["Joe", False, "05671", 13], 
         ["Johnna", True, "07145", 44] ] 

     self.mainbox = QtGui.QWidget(self) 
     self.layout = QtGui.QVBoxLayout() 
     self.mainbox.setLayout(self.layout) 
     self.setCentralWidget(self.mainbox) 

     self.table = QtGui.QTableWidget(self) 
     self.layout.addWidget(self.table) 

     self.button = QtGui.QPushButton('Update',self) 
     self.layout.addWidget(self.button) 

     self.click_btn_printouts() 
     self.button.clicked.connect(self.update) 

    def click_btn_printouts(self): 

     self.table.setRowCount(len(self.all_data)) 
     self.tableFields = ["Name", "isSomething", "someProperty", "someNumber"] 
     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])) 
      FullName.setFlags(FullName.flags() & ~QtCore.Qt.ItemIsEditable) 
      PreviouslyMailed = QtGui.QTableWidgetItem(str(self.item[1])) 
      LearnersDate = QtGui.QTableWidgetItem(str(self.item[2])) 
      RestrictedDate = QtGui.QTableWidgetItem(str(self.item[3])) 

      self.table.setItem(i, 0, FullName) 
      self.table.setItem(i, 1, PreviouslyMailed) 
      self.table.setItem(i, 2, LearnersDate) 
      self.table.setItem(i, 3, RestrictedDate) 

     self.changed_items = [] 
     self.table.itemChanged.connect(self.log_change) 

    def log_change(self, item): 
     self.table.blockSignals(True) 
     item.setBackgroundColor(QtGui.QColor("red")) 
     self.table.blockSignals(False) 
     self.changed_items.append(item) 
     print item.text(), item.column(), item.row() 

    def update(self): 
     print "Updating " 
     for item in self.changed_items: 
      self.table.blockSignals(True) 
      item.setBackgroundColor(QtGui.QColor("white")) 
      self.table.blockSignals(False) 
      self.writeToDatabase(item) 

    def writeToDatabase(self, item): 
     text, col, row = item.text(), item.column(), item.row() 
     #write those to database with your own code 


if __name__=='__main__': 
    app = QtGui.QApplication(sys.argv) 
    thisapp = App() 
    thisapp.show() 
    sys.exit(app.exec_()) 

Sie können dieses Beispiel jetzt verwenden, um auf weitere Probleme hinzuweisen.

+0

Vielen Dank. Ich schätze es sehr. –

+0

Es funktioniert übrigens perfekt. –

Verwandte Themen