database - PyQt 在 TableView 中加载数据库

标签 database pyqt pyqt5 blob qtsql

我在 pyqt ui 的 TableView 中正确加载数据库时遇到一些问题。问题是这些特定的数据库有包含 BLOB 数据的列,它们在 TableView 中显示不正确。 使用 sqlitebrowser for windows 打开同一个数据库将 blob 列的项目显示为具有多个值的文本字段(双击它显示所有),而在我的 tableview 中它只显示第一个项目的第一个字母。 tableview 有什么方法可以复制 sqlitebrowser 软件并正确显示 blob 并将项目显示为具有完整值的下拉列表? sqlitebrowser

这是我用来加载数据库的代码:

def loadevents(self, str):
        db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
        db.setDatabaseName(str)
        db.open()
        print('database is '+str)
        projectModel = QtSql.QSqlQueryModel()
        projectModel.setQuery("SELECT  * FROM tblEvents")
        self.tableWidget.setModel(projectModel)
        self.tableWidget.show()

如前所述,我希望正确加载 BLOB 类型(详细信息)的最后一列(所有文本),并且如果可能的话,将详细信息列中每个项目的所有子项目显示为下拉列表。 例如:在 sqlitebrowser 中双击“更新成功完成...”会显示多个值。

提前致谢。

乐: 修改代码:

        self.tableWidget = QtWidgets.QTableView(self.tab_3)
        self.tableWidget.setGeometry(QtCore.QRect(50, 13, 1000, 800))
        self.tableWidget.setMinimumSize(QtCore.QSize(1000, 800))
        self.tableWidget.setMaximumSize(QtCore.QSize(1000, 800))
        self.tableWidget.setObjectName("tableWidget")

是名为 Ui_MainWindow(object) 的类的函数的一部分 - 基本上是我们为窗口实例化的类

在同一个类中,我有另一个填充 TableView 的函数:

def loadevents(self, str):
        db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
        db.setDatabaseName(str)
        db.open()
        self.tableWidget.horizontalHeader().setStretchLastSection(True)
        delegate = BlobDelegate(self.tableWidget)
        self.tableWidget.setItemDelegateForColumn(4, delegate)
        model = QtSql.QSqlQueryModel()
        model.setQuery("SELECT  * FROM tblTransEvents")
        self.tableWidget.setModel(model)
        self.tableWidget.show()

它看起来像这样: newtableview

最佳答案

您必须实现一个解码 Blob 数据的委托(delegate):

import os
from PyQt5 import QtCore, QtGui, QtWidgets, QtSql


class BlobDelegate(QtWidgets.QStyledItemDelegate):
    def displayText(self, value, locale):
        if isinstance(value, QtCore.QByteArray):
            value = value.data().decode()
        return super(BlobDelegate, self).displayText(value, locale)


def createConnection():
    db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
    file = os.path.join(os.path.dirname(os.path.realpath(__file__)), "db.db")
    db.setDatabaseName(file)
    if not db.open():
        QtWidgets.QMessageBox.critical(
            None,
            QtWidgets.qApp.tr("Cannot open database"),
            QtWidgets.qApp.tr(
                "Unable to establish a database connection.\n"
                "This example needs SQLite support. Please read "
                "the Qt SQL driver documentation for information "
                "how to build it.\n\n"
                "Click Cancel to exit."
            ),
            QtWidgets.QMessageBox.Cancel,
        )
        return False
    return True


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    if not createConnection():
        sys.exit(-1)

    w = QtWidgets.QTableView()
    w.horizontalHeader().setStretchLastSection(True)
    w.setWordWrap(True)
    w.setTextElideMode(QtCore.Qt.ElideLeft)
    delegate = BlobDelegate(w)
    w.setItemDelegateForColumn(4, delegate)
    model = QtSql.QSqlQueryModel()
    model.setQuery("SELECT * FROM tblEvents")
    w.setModel(model)
    w.resize(640, 480)
    w.show()

    sys.exit(app.exec_())

enter image description here

关于database - PyQt 在 TableView 中加载数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56440219/

相关文章:

java - 来自 php mysql 的 Android 响应代码 200 但未在数据库中创建条目

python - 为什么 python 不显示在路径图标中?

python - 如何让 QScintilla 像 Sublime Text 一样自动缩进?

resize - 使 QTreeView 自动调整内容大小

python - 如何以不同的对齐方式将QLabels添加到QTableWidget中

php - 一旦表单的值进入PHP数据库,如何使表单消失

C# SQL Server Coonnectivity - 持续连接(客户端 - 服务器

python - 如何处理 IndentationError : unindent does not match any outer indentation level

qt - PyQt5 QSystemTrayIcon 在实际托盘之外

python - PyQt : How to set up a widget hidding an other widget if it's visible?