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

2024-06-16 15:07:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我以前问过一个类似的问题,但结果不起作用,我不知道为什么。 这是原始代码:

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])

建议在函数末尾添加以下代码(精确缩进):

^{pr2}$

并添加以下功能:

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

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

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

我要做的就是让用户能够更改QTableWidget中的数据,并将更改后的数据作为记录获取。在

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

我一直在想办法解决这个问题,我只想把它弄清楚,这是我最不需要做的事情来完成这个程序为一个客户。在


Tags: 数据selfdatatableallitemfullnamestr
1条回答
网友
1楼 · 发布于 2024-06-16 15:07:26

没有一个最小的工作示例总是很难回答的,所以我自己创建了一个示例,并将来自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_())

现在您可以使用这个例子来引用任何进一步的问题。在

相关问题 更多 >