PyQt 在表视图中加载数据库
PyQt load database in tableview
我在 pyqt ui 的表视图中正确加载数据库时遇到了一些问题。问题是这些特定的数据库有包含 BLOB 数据的列,它们在表视图中显示不正确。
使用 sqlitebrowser 为 windows 打开相同的数据库将 blob 列的项目显示为具有多个值的文本字段(双击它显示所有),而在我的表视图中它只显示第一个项目的第一个字母。
有什么方法可以复制 sqlitebrowser 软件并正确显示 blob 并将项目显示为具有完整值的下拉列表?
这是我用来加载数据库的代码:
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 中双击 "Updated completed successfully..." 显示多个值。
提前致谢。
乐:
修改代码:
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")
是 class 函数的一部分,称为 Ui_MainWindow(object) - 基本上我们为 window
实例化的 class
在同一个 class 中,我有另一个填充表视图的函数:
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()
它看起来像这样:
您必须实现一个解码 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_())
我在 pyqt ui 的表视图中正确加载数据库时遇到了一些问题。问题是这些特定的数据库有包含 BLOB 数据的列,它们在表视图中显示不正确。
使用 sqlitebrowser 为 windows 打开相同的数据库将 blob 列的项目显示为具有多个值的文本字段(双击它显示所有),而在我的表视图中它只显示第一个项目的第一个字母。
这是我用来加载数据库的代码:
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 中双击 "Updated completed successfully..." 显示多个值。
提前致谢。
乐: 修改代码:
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")
是 class 函数的一部分,称为 Ui_MainWindow(object) - 基本上我们为 window
实例化的 class在同一个 class 中,我有另一个填充表视图的函数:
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()
它看起来像这样:
您必须实现一个解码 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_())