【问题标题】:Populate a QTableView from SQLAlchemy从 SQLAlchemy 填充 QTableView
【发布时间】:2020-03-02 15:55:09
【问题描述】:

我正在尝试使用 PyQt5 和 SQLAlchemy 作为 orm 创建一些小型 GUI 应用程序,但是,我似乎找不到从 SQLAlchemy 查询中填充 QTableView 的方法。

我的目标是使用 SQLAlchemy 检索数据,然后在 QTableView 中显示查询结果。

我可以使用以下代码获取数据:

def fetch_data():
    metadata = db.schema.MetaData(bind=engine, reflect=True)
    table = db.Table('tbl_inv', metadata, autoload=True)

    query = db.select([
         table.columns.code,
         table.columns.decription,
         table.columns.uom,
    ])

    result = conn.execute(query)
    result_set = result.fetchall()

    return result_set

我正在尝试实现这一点,但没有成功。 Fastest way to populate QTableView from Pandas data frame.

我想我必须将我的数据放入数据框中,然后使用上面的链接解决方案,但我确信这在操作方面会很昂贵。

【问题讨论】:

    标签: python sqlalchemy pyqt5 qtableview


    【解决方案1】:

    程序步骤

    1. 设置环境
    sudo apt install python3-pip
    sudo pip3 install pyqt5
    sudo pip3 install sqlalchemy
    
    1. 运行demo.py(它将测试数据插入本地sqlite)
    from PyQt5.QtWidgets import QApplication, QWidget, QTableView, QAbstractItemView, QVBoxLayout
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5 import QtGui, QtCore
    import sqlalchemy as db
    import os
    
    # 1. rm demo.db
    os.remove("demo.db")
    
    engine = db.create_engine('sqlite:///demo.db?check_same_thread=False', echo=True)
    # 2. Creates demo table
    connection = engine.connect()
    metadata = db.MetaData()
    demoTable = db.Table('demo', metadata,
                db.Column('code', db.String(255), nullable=False),
                db.Column('decription', db.String(255), nullable=False),
                db.Column('uom', db.String(255), nullable=False)
                )
    
    metadata.create_all(engine) 
    
    # 3. Creates demo data
    query = db.insert(demoTable) 
    values_list = [
        {'code':'058176', 'decription':'01', 'uom':'rb1705,rb1710'},
        {'code':'058176', 'decription':'02', 'uom':'cu1705,cu1710'},
        {'code':'058176', 'decription':'03', 'uom':'zn1705,zn1710'},
        {'code':'058176', 'decription':'04', 'uom':'rb1705,rb1710'},
        {'code':'058176', 'decription':'01', 'uom':'zn1705,zn1710'},
        {'code':'058176', 'decription':'02', 'uom':'ru1705,ru1710'},
        {'code':'058176', 'decription':'02', 'uom':'ni1705,ni1710'},
        {'code':'058176', 'decription':'01', 'uom':'rb1705,rb1710'},
    ]
    ResultProxy = connection.execute(query,values_list)
    
    class DemoWindow(QWidget):
        def __init__(self, header, *args):
            QWidget.__init__(self, *args)
            self.setWindowTitle("Demo QTableView")
    
            self.table_model = DemoTableModel(self, header)
            self.table_view = QTableView()
            self.table_view.setModel(self.table_model)
            layout = QVBoxLayout(self)
            layout.addWidget(self.table_view)
            self.setLayout(layout)
    
    class DemoTableModel(QAbstractTableModel):
    
        def __init__(self, parent, header, *args):
            QAbstractTableModel.__init__(self, parent, *args)
            # 5. fetch data
            results = connection.execute(db.select([demoTable])).fetchall()
            self.mylist = results
            self.header = header
    
        def rowCount(self, parent):
            return len(self.mylist)
    
        def columnCount(self, parent):
            return len(self.mylist[0])
    
        def data(self, index, role):
            # 5. populate data
            if not index.isValid():
                return None
            if (role == Qt.DisplayRole):
                return self.mylist[index.row()][index.column()]
            else:
                return QVariant()
    
        def headerData(self, col, orientation, role):
            if orientation == Qt.Horizontal and role == Qt.DisplayRole:
                return self.header[col]
            return None
    
    if __name__ == '__main__':
        app = QApplication([])
        header = ['code', 'decription', 'uom']
        win = DemoWindow(header)
        win.show()
        app.exec_()
    

    【讨论】:

    • 这个演示效果很好,一旦我成功应用到我的应用程序,将标记为已接受的答案!
    • 我只想知道如何显示日期?因为它在我的应用程序中显示为空白,所以我如何在修改数据库时刷新QTableView
    • 只需在此处粘贴要点即可跟进。 gist.github.com/345161974/dd5003ed9b706adc557ee12e6a344c6e.
    • 这是一个 pyqt4 示例,但它显示了如何刷新 QTableView。见更新模型
    • 接受这个作为答案,因为我能够在我的应用程序中实现它。感谢updateModel 的链接,仍在尝试在我的应用中实现它。!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 2013-07-06
    • 2018-10-23
    相关资源
    最近更新 更多