У меня есть таблица, которая появляется в моем графическом интерфейсе. Пользователь может редактировать эту таблицу из графического интерфейса. как мне получить всю отредактированную информацию и обновить ее в базе данных? Пользователь устанавливает флажок для каждой строки, которую он хочет обновить в базе данных, поэтому у меня есть список всех строк, которые требуют обновления. Я хочу иметь список кортежей, где каждый кортеж представляет собой строку новых значений, которые необходимо обновить, учитывая, что поле ID остается неизменным (я также хочу знать, как сделать так, чтобы пользователь не мог редактировать некоторые поля).
def click_btn_mailouts(self):
self.screen_name = "mailouts"
self.cur.execute("""SELECT s.StudentID, 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.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, item in enumerate(self.all_data):
FullName = QtGui.QTableWidgetItem(str(item[1]))
PreviouslyMailed = QtGui.QTableWidgetItem(str(item[2]))
LearnersDate = QtGui.QTableWidgetItem(str(item[3]))
RestrictedDate = QtGui.QTableWidgetItem(str(item[4]))
DefensiveDate = QtGui.QTableWidgetItem(str(item[5]))
NextMail = QtGui.QTableWidgetItem(str(item[6]))
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])
"""here is the format that I have for the edit function"""
def click_btn_edit(self):
checkedRows = []
for i, checkbox in enumerate(self.checkbox_list):
if checkbox.checkState() == QtCore.Qt.Checked:
checkedRows.append(i)
"""as the list itterates, if the checkbox item is ticked,
it passes through the if statement, otherwise it is ignored.
checkedRows becomes a list of all the indexes in the table where
an edit needs to be made"""
Итак, в основном мне нужно знать, как получить изменения, внесенные в QTableWidget в графическом интерфейсе, с учетом списка индексов, в которые были внесены изменения, и каким-то образом обновить эти изменения в базе данных. Также было бы полезно знать, как запретить пользователю редактировать некоторые поля, так как это приведет к беспорядку в базе данных.
QtSql
, в котором вы можете определить подключение к базе данныхQtSql.QSqlDatabase
. Затем она управляется моделью базы данныхQtSql.QSqlTableModel
и подключается к базе данныхQtGui.QTableView
. Таким образом, изменения в QTableView напрямую отражаются в базе данных без необходимости написания каких-либо запросов к базе данных. Хорошей отправной точкой может быть это руководство tutorialspoint.com/pyqt/pyqt_database_handling.htm. - person ImportanceOfBeingErnest   schedule 28.09.2016