PyQt загрузить базу данных в виде таблицы - PullRequest
1 голос
/ 04 июня 2019

У меня есть некоторые проблемы с правильной загрузкой баз данных в виде таблицы в моем pyqt-интерфейсе.Проблема заключается в том, что в этих конкретных базах данных есть столбец, содержащий данные BLOB, и они не отображаются правильно в табличном представлении.При открытии той же базы данных с помощью sqlitebrowser для окон элементы столбца BLOB-объектов отображаются в виде текстового поля с несколькими значениями (двойной щелчок открывает все), а в моем табличном представлении отображается только первая буква первого элемента.tableview Есть ли способ реплицировать программное обеспечение sqlitebrowser, правильно отображать большой двоичный объект и отображать элементы в виде раскрывающегося списка с полными значениями?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 двойной щелчок «Обновление успешно завершено ...» выдает несколько значений.

Заранее спасибо.

LE: измененный код:

        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) - в основном класс, который мы создаем для окна

в том же классе, у меня есть другая функция, которая заполняет представление таблицы:

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

1 Ответ

1 голос
/ 04 июня 2019

Вы должны реализовать делегата, который декодирует данные BLOB-объектов:

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

...