如何从用户编辑的QTableWidget获取数据(Python与PyQT)

时间:2016-10-02 15:42:35

标签: python 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])

要添加的建议代码是(缩进准确)到函数的末尾:

    self.changed_items = set()
    self.table.itemChanged.connect(self.log_change)

并添加以下功能:

def log_change(self):
    self.changed_items.add(self.item)
    print(self.item)

预期的打印是编辑过的数据,但我得到的是编辑之前的数据。

我不能使用QTableView和QtSql,除非我能找到一种方法将它与SQL查询一起使用,将每个选定的记录放入列表中,并停止编辑某些列。如果有人知道如何做这些,那就太棒了,我现在真的没有时间自己完成所有的文档。

我想做的就是让用户能够从QTableWidget更改数据,并将更改后的数据作为记录。

基本上,我的最终目标是为QTableWidget提供相等的setEditStrategy(QSqlTableModel.OnManualSubmit)

我一直试图解决这个问题一段时间了,我只想把它弄清楚,这是我为客户完成这个程序需要做的最后一件事。

1 个答案:

答案 0 :(得分:1)

如果没有最小的工作示例,总是很难回答,所以我自己制作了一个并将other post中的建议放入,修改它,以便输出更改的项目文本及其在桌子内的位置。

# 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, "01234", 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_())

您现在可以使用此示例来引用任何其他问题。