Esempio n. 1
0
    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)
Esempio n. 2
0
 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)
Esempio n. 4
0
    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)
Esempio n. 5
0
    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)
Esempio n. 7
0
 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)
Esempio n. 8
0
 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)
Esempio n. 9
0
 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()   
Esempio n. 11
0
    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)
Esempio n. 12
0
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_())
Esempio n. 13
0
    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)