Сначала я кратко опишу свою программу
Описание программы
Ниже приведены две вдовы, используемые в программе:
Главное окно (группа Список)
Окно ввода (Стол для студентов)
Главное окно позволяет пользователям создавать / редактировать / удалять записи в списке групп (QListWidget
), в котором отображается заголовок каждой записи, прочитанной из базы данных Sqlite (БД). Кнопка «Создать» открывает новое окно ввода, которое позволяет пользователям вставлять записи в таблицу ученика (QTableWidget
). Кнопка «+» добавляет новую строку в таблицу, а кнопка «-» удаляет выбранную строку. «Имя» и «Возраст» каждой записи могут быть отредактированы непосредственно, нажав на ячейку в таблице. Кнопка «Сохранить» сохраняет заголовок и входные данные таблицы (записи учеников: «Имя» и «Возраст») в БД и обновляет список «Группы» в главном окне. Кнопка «Отмена» закрывает окно ввода без сохранения внесенных в него изменений.
База данных
Список групп (QListView)
Стол ученика (QTableWidget)
Я использую SQLite с использованием класса Qtsql
PyQt5 для базы данных. 'group_id' в таблице Student - это FK для идентификатора списка групп.
Моя проблема
Я хотел бы иметь возможность чтобы выбрать запись в списке «Группы», нажмите кнопку «Редактировать» и отобразите таблицу учеников окна ввода, заполненную данными из БД, как показано выше. Я попытался использовать QDataWidgetMapper
, так как он хорошо работал с заполнением QTextEdit и QLineEdit, но у меня возникли проблемы с заполнением QTableWidget
.
Как заполнить QTableWidget из базы данных в этом контексте. Есть ли метод, который мне не хватает в QDataWidgetMapper
?
Коды
Соответствующие фрагменты моего кода, где я пытаюсь отобразить таблицу Student в БД на PyQt5 (Большая часть этого - моя адаптированная версия Ответ eyllanes c на Доступ к SQL данным из списка )
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self._groups_model = QtSql.QSqlTableModel(self)
self.groups_model.setTable("Groups")
self.groups_model.select()
self._student_model = QtSql.QSqlTableModel(self)
self.student_model.setTable("Student")
self.student_model.select()
self.sql_list_view = QtWidgets.QListView()
self.sql_list_view.setModel(self.groups_model)
self.sql_list_view.setModelColumn(self.groups_model.record().indexOf("group_name"))
...
@property
def macro_model(self):
return self._macro_model
@property
def sheets_model(self):
return self._sheets_model
@QtCore.pyqtSlot()
def edit(self):
ixs = self.listView_macros.selectionModel().selectedIndexes()
if ixs:
print(ixs)
d = EditDialog(self.groups_model, ixs[0].row(), self.student_model)
d.exec_()
class EditDialog(QtWidgets.QDialog):
def __init__(self, gr_model, gr_idx, std_model, parent=None):
super().__init__(parent)
self.title_le = QtWidgets.QLineEdit()
self.student_table = QtWidgets.QTableWidget(self)
groups_mapper = QtWidgets.QDataWidgetMapper(
self, submitPolicy=QtWidgets.QDataWidgetMapper.ManualSubmit
)
groups_mapper.setModel(gr_model)
groups_mapper.addMapping(self.title_le, gr_model.record().indexOf("group_name"))
groups_mapper.setCurrentIndex(gr_idx)
student_mapper = QtWidgets.QDataWidgetMapper(
self, submitPolicy=QtWidgets.QDataWidgetMapper.ManualSubmit
)
student_mapper.setModel(std_model)
student_mapper.addMapping(self.student_table, ????) # << I am having trouble here