def set_models(self): #Assign models self.cities_list_model = models.SqlQueryModel() self.listViewCities.setModel(self.cities_list_model) self.buildings_list_model = models.SqlQueryModel() self.listViewBuildings.setModel(self.buildings_list_model) self.characters_list_model = models.SqlQueryModel() self.listViewCharacters.setModel(self.characters_list_model) self.table_content_model = models.SqlRelationalModel( db=self.QConnection) self.tableViewContent.setModel(self.table_content_model) self.tableViewContent.setItemDelegate( QtSql.QSqlRelationalDelegate(self.tableViewContent)) self.table_special_model = models.SqlRelationalModel( db=self.QConnection) self.tableViewSpecial.setModel(self.table_special_model) self.tableViewSpecial.setItemDelegate( QtSql.QSqlRelationalDelegate(self.tableViewSpecial)) self.side_view_value_model = models.StringListModel() self.listViewSelectedValue.setModel(self.side_view_value_model) self.wealth_model = models.StringListModel() self.wealth_model.setStringList(catalogs_character.wealth) self.comboBoxVisitor.setModel(self.wealth_model)
def tableUp(self): if self.Box.currentText() == 'Группы': self.Table.setModel(self.sql.STM('bands')) self.Table.hideColumn(0) self.Table.resizeRowsToContents() self.Table.setColumnWidth(2, 166) self.Table.setSortingEnabled(True) if self.Box.currentText() == 'Пользователи': self.Table.setModel(self.sql.STM('users')) self.Table.hideColumn(0) self.Table.resizeRowsToContents() self.Table.setColumnWidth(2, 166) self.Table.setSortingEnabled(True) if self.Box.currentText() == 'Коментарии': self.Table.setModel(self.sql.STM('comments')) self.Table.hideColumn(0) self.Table.resizeRowsToContents() self.Table.setColumnWidth(2, 166) self.Table.setSortingEnabled(True) if self.Box.currentText() == 'Аренда': self.Table.setModel(self.sql.STM('rent')) self.Table.hideColumn(0) self.Table.resizeRowsToContents() self.Table.setColumnWidth(2, 166) self.Table.setSortingEnabled(True) if self.Box.currentText() == 'Новости': self.Table.setModel(self.sql.STM('news_admin')) self.Table.hideColumn(0) self.Table.resizeRowsToContents() self.Table.setColumnWidth(2, 166) self.Table.setSortingEnabled(True) if self.Box.currentText() == 'Фотографии': self.Table.setModel(self.sql.STM('photo')) self.Table.hideColumn(0) self.Table.resizeRowsToContents() self.Table.setColumnWidth(2, 166) self.Table.setSortingEnabled(True) if self.Box.currentText() == 'Записи': self.Table.setModel(self.sql.STMR('sing_up')) self.Table.setItemDelegateForColumn( 1, QtSql.QSqlRelationalDelegate(self.Table)) self.Table.hideColumn(0) self.Table.resizeRowsToContents() self.Table.setColumnWidth(2, 166) self.Table.setSortingEnabled(True) if self.Box.currentText() == 'Приемка': self.Table.setModel(self.sql.STMR('pay')) self.Table.setItemDelegateForColumn( 1, QtSql.QSqlRelationalDelegate(self.Table)) self.Table.hideColumn(0) self.Table.resizeRowsToContents() self.Table.setColumnWidth(2, 166) self.Table.setSortingEnabled(True)
def __init__(self, tableName, newDB, parent=None): super(PersonEditor, self).__init__(parent) if newDB: self.createTable() #self.model = QtSql.QSqlTableModel(self) self.model = QtSql.QSqlRelationalTableModel(self) self.model.setTable(tableName) self.model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit) #self.model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange) self.model.setRelation(3, QtSql.QSqlRelation('gender', 'id', 'name')) for c in range(self.model.columnCount()): self.model.setHeaderData(c, QtCore.Qt.Horizontal, self.tr(self.model.record().fieldName(c))) self.model.select() self.view = QtWidgets.QTableView() self.view.setModel(self.model) self.view.setItemDelegate(QtSql.QSqlRelationalDelegate(self.view)) self.view.resizeColumnsToContents() buttons = Buttons(self) mainLayout = QtWidgets.QVBoxLayout() mainLayout.addWidget(self.view) mainLayout.addWidget(buttons.buttonBox) self.setLayout(mainLayout)
def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) QtWidgets.QWidget() self.setWindowTitle('table grid 2') conDt = conDatabase() self.con = conDt.con self.con.open() self.stm = conDt.stmCreate(self) # self.conDt.stmCreate(self) # self.stm = self.conDt.stm self.vbox = QtWidgets.QVBoxLayout() self.tv = QtWidgets.QTableView() self.tv.setModel(self.stm) self.tv.setItemDelegate(QtSql.QSqlRelationalDelegate(self.tv)) self.tv.hideColumn(0) self.tv.setColumnWidth(1, 350) self.tv.setColumnWidth(2, 100) self.vbox.addWidget(self.tv) self.btnAdd = QtWidgets.QPushButton('&Add record') self.btnAdd.clicked.connect(self.addRecord) self.vbox.addWidget(self.btnAdd) self.btnDel = QtWidgets.QPushButton('&Delete record') # self.btnDel.clicked.connect(lambda: self.delRecord(stm, self.tv)) self.btnDel.clicked.connect(self.delRecord) self.vbox.addWidget(self.btnDel) self.setLayout(self.vbox)
def __init__(self, model, appname, parent=None): super(Page, self).__init__(parent) self.view = QtWidgets.QTableView() self.view.setModel(model) self.view.setItemDelegateForColumn(0, AutoIncrement(self.view)) self.view.setSelectionBehavior(QtWidgets.QTableView.SelectRows) self.view.setAlternatingRowColors(True) self.view.setSortingEnabled(True) self.view.setItemDelegate(QtSql.QSqlRelationalDelegate(self.view)) self.insertButton = QtWidgets.QPushButton(u"Вставить") self.insertButton.clicked.connect(self.insert) self.removeButton = QtWidgets.QPushButton(u"Удалить") self.removeButton.clicked.connect(self.remove) self.updateButton = QtWidgets.QPushButton(u"Обновить") self.updateButton.clicked.connect(self.update) self.saveButton = QtWidgets.QPushButton(u"Сохранить") self.saveButton.clicked.connect(self.save) self.undoButton = QtWidgets.QPushButton(u"Отменить") self.undoButton.clicked.connect(self.undo) self.popMenu = QtWidgets.QMenu(self.view) self.popMenu.addAction(u"Вставить", self.insert) self.popMenu.addAction(u"Удалить", self.remove) self.popMenu.addSeparator() self.popMenu.addAction(u"Обновить", self.update) self.popMenu.addAction(u"Сохранить", self.save) self.popMenu.addAction(u"Отменить", self.undo) self.view.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.view.customContextMenuRequested.connect(self.onContextMenu) #self.connect(self.view, QtCore.SIGNAL("customContextMenuRequested(const QPoint &)"), self.onContextMenu) viewselectionModel = self.view.selectionModel() viewselectionModel.selectionChanged.connect(self.updateActions) self.view.model().dataChanged.connect(self.dataChanged) self.hasUndo = False buttonsLayout = QtWidgets.QHBoxLayout() buttonsLayout.addWidget(self.insertButton) buttonsLayout.addWidget(self.removeButton) buttonsLayout.addStretch(1) buttonsLayout.addWidget(self.updateButton) buttonsLayout.addWidget(self.saveButton) buttonsLayout.addWidget(self.undoButton) self.mainLayout = QtWidgets.QVBoxLayout() self.mainLayout.addWidget(self.view) self.mainLayout.addLayout(buttonsLayout, 1) self.setLayout(self.mainLayout) self.readSettings() self.updateActions()
def __init__(self, coffees_model, reviews_model): super().__init__() self.setLayout(qtw.QFormLayout()) # Coffee Fields self.coffee_brand = qtw.QLineEdit() self.layout().addRow('Brand: ', self.coffee_brand) self.coffee_name = qtw.QLineEdit() self.layout().addRow('Name: ', self.coffee_name) self.roast = qtw.QComboBox() self.layout().addRow('Roast: ', self.roast) # Map the coffee fields self.coffees_model = coffees_model self.mapper = qtw.QDataWidgetMapper(self) self.mapper.setModel(self.coffees_model) self.mapper.setItemDelegate( qts.QSqlRelationalDelegate(self)) self.mapper.addMapping( self.coffee_brand, self.coffees_model.fieldIndex('coffee_brand') ) self.mapper.addMapping( self.coffee_name, self.coffees_model.fieldIndex('coffee_name') ) self.mapper.addMapping( self.roast, self.coffees_model.fieldIndex('description') ) # retrieve a model for the roasts and setup the combo box roasts_model = coffees_model.relationModel( self.coffees_model.fieldIndex('description')) self.roast.setModel(roasts_model) self.roast.setModelColumn(1) # Cause data to be written when changed # Reviews self.reviews = qtw.QTableView() self.layout().addRow(self.reviews) self.reviews.setModel(reviews_model) self.reviews.hideColumn(0) self.reviews.hideColumn(1) self.reviews.horizontalHeader().setSectionResizeMode( 4, qtw.QHeaderView.Stretch) # Using a custom delegate self.dateDelegate = DateDelegate() self.reviews.setItemDelegateForColumn( reviews_model.fieldIndex('review_date'), self.dateDelegate) # add and delete reviews self.new_review = qtw.QPushButton( 'New Review', clicked=self.add_review) self.delete_review = qtw.QPushButton( 'Delete Review', clicked=self.delete_review) self.layout().addRow(self.new_review, self.delete_review)
def EntPayD(self): self.Table.setModel(self.sql.STMR('pay', 'date', self.PayDate.text())) self.Table.setItemDelegateForColumn( 1, QtSql.QSqlRelationalDelegate(self.Table)) self.Table.hideColumn(0) self.Table.resizeRowsToContents() self.Table.setColumnWidth(2, 166) self.Table.setSortingEnabled(True)
def FilterDay(self): self.Table.setModel( self.sql.STMR('sing_up', 'date', datetime.datetime.now().strftime("%d.%m.%Y"))) self.Table.setItemDelegateForColumn( 1, QtSql.QSqlRelationalDelegate(self.Table)) self.Table.hideColumn(0) self.Table.resizeRowsToContents() self.Table.setColumnWidth(2, 166) self.Table.setSortingEnabled(True)
def EntRec(self): self.Table.setModel( self.sql.STMR( 'sing_up', 'id_nameB', str( self.sql.SelectOne('bands', 'ID', 'nameB', "'" + self.BandBox.currentText() + "'")[0]))) self.Table.setItemDelegateForColumn( 1, QtSql.QSqlRelationalDelegate(self.Table)) self.Table.hideColumn(0) self.Table.resizeRowsToContents() self.Table.setColumnWidth(2, 166) self.Table.setSortingEnabled(True)
def ModelTableViewLink (MyTableView, MyTableName): MyModel = MyTableModel() MyModel.ConfigTable(MyTableName,cfgDB.DicTable[MyTableName][0], cfgDB.DicTable[MyTableName][1], cfgDB.DicTable[MyTableName][2]) for row in cfgDB.DicJoin[MyTableName]: (NumColumn,(SqlTable, SqlKey, SqlDesc)) = row MyModel.setRelation(NumColumn,QtSql.QSqlRelation(SqlTable, SqlKey, SqlDesc)) MyTableView.setModel(MyModel) MyTableView.setSortingEnabled(True) if len(cfgDB.DicJoin[MyTableName])>0: MyTableView.setItemDelegate(QtSql.QSqlRelationalDelegate(MyTableView)) MyTableView.show()
def __init__(self, table_name: str, parent=None): super().__init__() self.parent = parent self.model = QtSql.QSqlRelationalTableModel(parent) self.model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit) self.model.setTable(table_name) self._init_relations(table_name) self.model.select() self.view = QTableView(parent) self.view.setModel(self.model) if table_name == 'schedule' or table_name == 'subjects': self.view.setItemDelegate(QtSql.QSqlRelationalDelegate(self.view)) self.view.resizeColumnsToContents() self.view.verticalHeader().setVisible(False)
con = QtSql.QSqlDatabase.addDatabase('QSQLITE') con.setDatabaseName('data.sqlite') con.open() stm = QtSql.QSqlRelationalTableModel(parent=window) stm.setTable('good') stm.setSort(1, QtCore.Qt.AscendingOrder) # Задаем для поля категории связь с таблицей списка категорий stm.setRelation(3, QtSql.QSqlRelation('category', 'id', 'catname')) stm.select() stm.setHeaderData(1, QtCore.Qt.Horizontal, 'Название') stm.setHeaderData(2, QtCore.Qt.Horizontal, 'Кол-во') stm.setHeaderData(3, QtCore.Qt.Horizontal, 'Категория') vbox = QtWidgets.QVBoxLayout() tv = QtWidgets.QTableView() tv.setModel(stm) tv.setItemDelegateForColumn(3, QtSql.QSqlRelationalDelegate(tv)) tv.hideColumn(0) tv.setColumnWidth(1, 150) tv.setColumnWidth(2, 60) tv.setColumnWidth(3, 150) vbox.addWidget(tv) btnAdd = QtWidgets.QPushButton("&Добавить запись") btnAdd.clicked.connect(addRecord) vbox.addWidget(btnAdd) btnDel = QtWidgets.QPushButton("&Удалить запись") btnDel.clicked.connect(delRecord) vbox.addWidget(btnDel) window.setLayout(vbox) window.resize(430, 250) window.show() sys.exit(app.exec_())
def __init__(self): """MainWindow constructor. Code in this method should define window properties, create backend resources, etc. """ super().__init__() # Code starts here self.stack = qtw.QStackedWidget() self.setCentralWidget(self.stack) # Connect to the database db = qts.QSqlDatabase.addDatabase('QSQLITE') db.setDatabaseName('coffee.db') if not db.open(): qtw.QMessageBox.critical( None, 'DB Connection Error', 'Could not open database file: ' f'{db.lastError().text()}') sys.exit(1) # Check for missing tables required_tables = {'roasts', 'coffees', 'reviews'} missing_tables = required_tables - set(db.tables()) if missing_tables: qtw.QMessageBox.critical( None, 'DB Integrity Error', 'Missing tables, please repair DB: ' f'{missing_tables}') sys.exit(1) # Create the models self.reviews_model = qts.QSqlTableModel() self.reviews_model.setTable('reviews') self.coffees_model = qts.QSqlRelationalTableModel() self.coffees_model.setTable('coffees') self.coffees_model.setRelation( self.coffees_model.fieldIndex('roast_id'), qts.QSqlRelation('roasts', 'id', 'description') ) self.coffees_model.setEditStrategy(0) self.coffees_model.dataChanged.connect(print) self.coffee_list = qtw.QTableView() self.coffee_list.setModel(self.coffees_model) self.stack.addWidget(self.coffee_list) self.coffees_model.select() #self.show() #return self.show_list() # Inserting and deleting rows. toolbar = self.addToolBar('Controls') toolbar.addAction('Delete Coffee(s)', self.delete_coffee) toolbar.addAction('Add Coffee', self.add_coffee) self.coffee_list.setItemDelegate(qts.QSqlRelationalDelegate()) #self.show() #return # The coffee form self.coffee_form = CoffeeForm( self.coffees_model, self.reviews_model ) self.stack.addWidget(self.coffee_form) self.coffee_list.doubleClicked.connect( self.coffee_form.show_coffee) self.coffee_list.doubleClicked.connect( lambda: self.stack.setCurrentWidget(self.coffee_form)) toolbar.addAction("Back to list", self.show_list) # Code ends here self.show()
def on_e_catalog_btn(parent, db_path): def on_add_employee(): em.insertRow(em.rowCount()) def on_del_employee(): em.removeRow(emv.currentIndex().row()) em.select() def on_data_change(em): em.submitAll() # Считаем количество записей после сохранения query = QtSql.QSqlQuery() query.exec("SELECT COUNT(*) AS new_count FROM employee") query.next() recordCount = query.record() new_count_int = query.value(recordCount.indexOf("new_count")) if old_count_int != new_count_int: msg_lbl = QLabel( '<span style="color:green">Добавлен новый сотрудник</span>') parent.sm_list_widget.clear() parent.item = QListWidgetItem() parent.sm_list_widget.addItem(parent.item) parent.sm_list_widget.setItemWidget(parent.item, msg_lbl) con = QtSql.QSqlDatabase.addDatabase('QSQLITE') con.setDatabaseName(db_path) con.open() parent.employee_table_window = QWidget() parent.employee_table_window.setWindowModality( QtCore.Qt.ApplicationModal) parent.employee_table_window.setWindowTitle("Список сотрудников") parent.employee_table_window.resize(240, 250) em = QtSql.QSqlRelationalTableModel( parent=parent.employee_table_window) em.setTable('employee') em.setSort(0, QtCore.Qt.AscendingOrder) em.setRelation( 2, QtSql.QSqlRelation( 'positions', 'position', 'position')) em.select() em.setHeaderData(1, QtCore.Qt.Horizontal, 'ФИО') em.setHeaderData(2, QtCore.Qt.Horizontal, 'Должность') emv = QTableView() emv.setModel(em) emv.setItemDelegate(QtSql.QSqlRelationalDelegate(emv)) emv.hideColumn(0) vbox = QVBoxLayout() vbox.addWidget(emv) btnAdd = QPushButton("Добавить сотрудника") btnAdd.clicked.connect(on_add_employee) vbox.addWidget(btnAdd) btnDel = QPushButton("Удалить сотрудника") btnDel.clicked.connect(on_del_employee) vbox.addWidget(btnDel) parent.employee_table_window.setLayout(vbox) parent.employee_table_window.show() # Считаем количество записей до сохранения query = QtSql.QSqlQuery() query.exec("SELECT COUNT(*) AS old_count FROM employee") query.next() recordCount = query.record() old_count_int = query.value(recordCount.indexOf("old_count")) query.finish() em.dataChanged.connect(lambda: on_data_change(em)) screen = QDesktopWidget().screenGeometry() x = int((screen.width() - parent.employee_table_window.width()) / 2) y = int((screen.height() - parent.employee_table_window.height()) / 2) parent.employee_table_window.move(x, y)
def on_n_catalog_btn(parent, db_path): def on_add_item(): nm.insertRow(nm.rowCount()) nm_row_count = nm.rowCount() img_btn = QPushButton("Выбрать") img_btn.setStyleSheet( "border-width: 1px;" "border-style: solid;" "border-color: dimgray;" "border-radius: 4px;" "background-color: silver;") img_btn.clicked.connect(on_img_choose) img_btn.setFixedSize(90, 25) cell = nm.index(nm_row_count - 1, 4) nmv.setIndexWidget(cell, img_btn) def on_del_item(): nm.removeRow(nmv.currentIndex().row()) nm.select() empty_lbl = QLabel() parent.setCentralWidget(empty_lbl) parent.cdw.setWidget(empty_lbl) parent.ldw_tree_model.removeRows(0, parent.ldw_tree_model.rowCount()) con = sqlite3.connect(db_path) cur = con.cursor() sql_cats_select = """\ SELECT DISTINCT item_cat FROM nomenclature """ cur.execute(sql_cats_select) arr = cur.fetchall() for cat in arr: sql_items_select = "SELECT item_name FROM nomenclature \ WHERE item_cat = ?" cur.execute(sql_items_select, [cat[0]]) items = cur.fetchall() parent_item = QStandardItem(cat[0]) parent.ldw_tree_model.appendRow(parent_item) j = 0 for item in items: child_item = QStandardItem(item[0]) parent_item.setChild(j, 0, child_item) j = j + 1 parent.ldw_tree.setModel(parent.ldw_tree_model) def on_img_choose(): cur_index = nmv.currentIndex().row() numb_txt = nm.index(cur_index, 0).data() item_form_class.on_form_open(parent.nom_table_window, numb_txt, db_path, parent) con = QtSql.QSqlDatabase.addDatabase('QSQLITE') con.setDatabaseName(db_path) con.open() parent.nom_table_window = QWidget() parent.nom_table_window.setWindowModality(QtCore.Qt.ApplicationModal) parent.nom_table_window.setWindowTitle("Номенклатура товаров") parent.nom_table_window.resize(760, 250) nm = QtSql.QSqlRelationalTableModel(parent=parent.nom_table_window) nm.setTable('nomenclature') nm.setSort(0, QtCore.Qt.AscendingOrder) nm.setRelation(2, QtSql.QSqlRelation('units', 'unit', 'unit')) nm.setRelation( 3, QtSql.QSqlRelation( 'categories', 'category', 'category')) nm.select() nmv = QTableView() nmv.setModel(nm) nmv.setItemDelegate(QtSql.QSqlRelationalDelegate(nmv)) nmv.setColumnWidth(0, 130) nmv.setColumnWidth(1, 320) nmv.setColumnWidth(2, 50) nmv.setColumnWidth(3, 130) nmv.setColumnWidth(4, 90) # Задаем заголовки для столбцов модели nm.setHeaderData(0, QtCore.Qt.Horizontal, 'Номенклатурный №') nm.setHeaderData(1, QtCore.Qt.Horizontal, 'Название') nm.setHeaderData(2, QtCore.Qt.Horizontal, 'Ед. изм.') nm.setHeaderData(3, QtCore.Qt.Horizontal, 'Категория') nm.setHeaderData(4, QtCore.Qt.Horizontal, 'Изображение') items_vbox = QVBoxLayout() items_vbox.addWidget(nmv) nm_row_count = nm.rowCount() for index in range(nm_row_count): img_btn = QPushButton("Выбрать") img_btn.setStyleSheet( "border-width: 1px;" "border-style: solid;" "border-color: dimgray;" "border-radius: 4px;" "background-color: silver;") img_btn.clicked.connect(on_img_choose) img_btn.setFixedSize(90, 25) cell = nm.index(index, 4) nmv.setIndexWidget(cell, img_btn) btnAdd = QPushButton("Добавить товар") btnAdd.clicked.connect(on_add_item) items_vbox.addWidget(btnAdd) btnDel = QPushButton("Удалить товар") btnDel.clicked.connect(on_del_item) items_vbox.addWidget(btnDel) parent.nom_table_window.setLayout(items_vbox) parent.nom_table_window.show() # Считаем количество записей до сохранения query = QtSql.QSqlQuery() query.exec("SELECT COUNT(*) AS old_count FROM nomenclature") query.next() recordCount = query.record() old_count_int = query.value(recordCount.indexOf("old_count")) query.finish() print(nm.dataChanged.connect(nm.submitAll)) screen = QDesktopWidget().screenGeometry() x = int((screen.width() - parent.nom_table_window.width()) / 2) y = int((screen.height() - parent.nom_table_window.height()) / 2) parent.nom_table_window.move(x, y)
def on_u_catalog_btn(parent, db_path): def on_add_user(): # Добавляем строку um.insertRow(um.rowCount()) def on_del_user(): # Удаляем строку um.removeRow(umv.currentIndex().row()) # Выполняем повторное считывание данных в модель, # чтобы убрать пустую "мусорную" запись um.select() def on_data_change(um): um.submitAll() # Считаем количество записей после сохранения query = QtSql.QSqlQuery() query.exec("SELECT COUNT(*) AS new_count FROM users") query.next() recordCount = query.record() new_count_int = query.value(recordCount.indexOf("new_count")) if old_count_int != new_count_int: msg_lbl = QLabel( '<span style="color:green">Добавлен новый пользователь</span>') parent.sm_list_widget.clear() parent.item = QListWidgetItem() parent.sm_list_widget.addItem(parent.item) parent.sm_list_widget.setItemWidget(parent.item, msg_lbl) # Устанавливаем соединение с базой данных con = QtSql.QSqlDatabase.addDatabase('QSQLITE') con.setDatabaseName(db_path) con.open() # Создаем окно parent.u_table_window = QWidget() parent.u_table_window.setWindowModality(QtCore.Qt.ApplicationModal) parent.u_table_window.setWindowTitle("Справочник 'Пользователи'") parent.u_table_window.resize(440, 300) # Создаем модель um = QtSql.QSqlRelationalTableModel(parent=parent.u_table_window) # Связываем таблицу с моделью um.setTable('users') um.setSort(0, QtCore.Qt.AscendingOrder) # Устанавливаем связь с внешней таблицей um.setRelation(4, QtSql.QSqlRelation('rules', 'rule', 'rule')) # Считываем данные в модель um.select() # Задаем заголовки для столбцов модели um.setHeaderData(1, QtCore.Qt.Horizontal, 'Логин') um.setHeaderData(2, QtCore.Qt.Horizontal, 'Пароль') um.setHeaderData(3, QtCore.Qt.Horizontal, 'Имя') um.setHeaderData(4, QtCore.Qt.Horizontal, 'Права') # При изменении данных выполняем сохранение # Считаем количество записей до сохранения query = QtSql.QSqlQuery() query.exec("SELECT COUNT(*) AS old_count FROM users") query.next() recordCount = query.record() old_count_int = query.value(recordCount.indexOf("old_count")) query.finish() um.dataChanged.connect(lambda: on_data_change(um)) # Создаем виджет-таблицу umv = QTableView() # Связываем модель с виджетом-таблицей umv.setModel(um) umv.setItemDelegate(QtSql.QSqlRelationalDelegate(umv)) umv.hideColumn(0) # Создаем контейнер users_vbox = QVBoxLayout() users_vbox.addWidget(umv) # Создаем кнопки и размещаем их в контейнеры btnAdd = QPushButton("Добавить пользователя") btnAdd.clicked.connect(on_add_user) users_vbox.addWidget(btnAdd) btnDel = QPushButton("Удалить пользователя") btnDel.clicked.connect(on_del_user) users_vbox.addWidget(btnDel) # Размещаем контейнер в окне parent.u_table_window.setLayout(users_vbox) parent.u_table_window.show() screen = QDesktopWidget().screenGeometry() x = int((screen.width() - parent.u_table_window.width()) / 2) y = int((screen.height() - parent.u_table_window.height()) / 2) parent.u_table_window.move(x, y)