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)
。
我一直试图解决这个问题一段时间了,我只想把它弄清楚,这是我为客户完成这个程序需要做的最后一件事。
答案 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_())
您现在可以使用此示例来引用任何其他问题。