gpt4 book ai didi

qt - PyQt:为现有数据库制作 CRUD UI 的最简单方法?

转载 作者:行者123 更新时间:2023-12-04 12:59:23 24 4
gpt4 key购买 nike

在最少的代码中,我应该如何枚举现有数据库表中的(数百)列,并创建一个与数据库耦合的 TableView ,并在表单元格中使用类型适当的小部件来修改数据?

我知道这过去很简单,这要归功于 Qt Designer 的数据库连接向导,但它已被弃用。

最佳答案

据说最简单的方法是使用 QSqlTableModel .
假设我们想要:

  • 查看数据并在表之间切换
  • 使用适当的编辑器编辑数据,例如QSpinBox 整数
  • 插入行
  • 并删除行

  • 好的,首先我们需要获取数据库中所有表的列表。这可以使用 QSqlDatabase::tables 来实现方法。我也会使用 QComboxBox显示表格:
     class MainWindow(QtWidgets.QFrame):
    def __init__(self, parent=None):
    QtWidgets.QFrame.__init__(self, parent)

    # Connect to database
    self.__database__ = QtSql.QSqlDatabase.addDatabase('QSQLITE')
    self.__database__.setDatabaseName('sqlite.db')
    self.__database__.open()

    # Create QComboBox to show tables
    self.__tableNames__ = QtWidgets.QComboBox(self)

    # Create QTableView to show table's data
    self.__tableGrid__ = QtWidgets.QTableView(self)

    # Create table model
    self.__tableModel__ = QtSql.QSqlTableModel(self, self.__database__)
    self.__tableGrid__.setModel(self.__tableModel__)

    # Connect combobox signal to update model
    self.__tableNames__.currentIndexChanged[str].connect(self.__tableModel__.setTable)
    self.__tableNames__.currentIndexChanged[str].connect(self.__tableModel__.select)

    # Set the list of the tables to combobox
    self.__tableNames__.addItems(self.__database__.tables())

    现在我们已经可以在数据库的表之间切换和编辑数据了。但默认编辑器是 QLineEdit .我们可以使用 QItemDelegate 提供其他编辑器类(class)。在 createEditor函数我们可以从 QSqlField 获取列的类型.有一个缺点,因为至少对于 DATETIME 的 SQLite它总是返回 string (但它是 SQLite :))。可能您应该找到其他方法来获取类型。
     class SqlItemDelegate(QtWidgets.QStyledItemDelegate):
    def __init__(self, database, parent=None):
    QtWidgets.QStyledItemDelegate.__init__(self, parent)
    self.__table__ = ''
    self.__database__ = database

    def setTable(self, table):
    self.__table__ = table

    def createEditor(self, parent, option, index):
    record = self.__database__.record(self.__table__)
    column_type = record.field(record.fieldName(index.column())).type()

    print(record.fieldName(index.column()), column_type)
    if column_type == QtCore.QVariant.Double:
    return QtWidgets.QDoubleSpinBox(parent)
    if column_type == QtCore.QVariant.DateTime:
    return QtWidgets.QDateTimeEditor(parent)
    # etc.

    return QtWidgets.QStyledItemDelegate.createEditor(self, parent, option, index)

    同样在 MainWindow 中,我们应该创建委托(delegate)并将其与组合框连接以更新表名:

    类 MainWindow(QtWidgets.QFrame):
    定义 初始化 (自我, parent =无):
    # ...
         self.__delegate__ = SqlItemDelegate(self.__database__, self)
    self.__tableGrid__.setItemDelegate(self.__delegate__)

    self.__tableNames__.currentIndexChanged[str].connect(self.__delegate__.setTable)

    最后一步是执行 insertdelete职能:
     class MainWindow(QtWidgets.QFrame):
    def __init__(self, parent=None):
    # .....

    self.__insertRow__ = QtWidgets.QPushButton('Insert', self)
    self.__insertRow__.clicked.connect(self.insertRow)
    self.__deleteRow__ = QtWidgets.QPushButton('Delete', self)
    self.__deleteRow__.clicked.connect(self.deleteRow)

    def deleteRow(self):
    index = self.__tableGrid__.currentIndex()
    self.__tableModel__.removeRows(index.row(), 1)

    def insertRow(self):
    self.__tableModel__.insertRows(0, 1)

    关于qt - PyQt:为现有数据库制作 CRUD UI 的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20760011/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com