【发布时间】:2018-09-24 02:20:44
【问题描述】:
我正在尝试借助 QML 的 TableViewcomponent 在表中显示来自 MySQL 数据库的数据。
最初我尝试从QSqlQuery 对象创建QSqlQueryModel 对象并将其作为属性传递给QML 上下文。但是我从Qt documentation 得知我必须实现roleNames() 以提供列到角色映射到TableView,所以我像这样子类化QSqlQueryModel
import sys
from PyQt5.QtCore import QUrl, Qt
from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQuick import QQuickView
from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlQueryModel
class QtTabModel(QSqlQueryModel):
def __init__(self):
super(QtTabModel, self).__init__()
@staticmethod
def roleNames():
roles = {
Qt.UserRole + 1 : "id",
Qt.UserRole + 2 : "name"
}
return roles
app = QGuiApplication(sys.argv)
view = QQuickView()
db = QSqlDatabase.addDatabase("QMYSQL")
db.setHostName("localhost")
db.setDatabaseName("qtdb")
db.setUserName("abc")
db.setPassword("xyz")
qry = QSqlQuery()
if db.open():
qry = db.exec("SELECT id, name FROM qttab")
tabmodel = QtTabModel()
tabmodel.setQuery(qry)
ctx = view.rootContext()
ctx.setContextProperty("tabmodel", tabmodel)
view.setSource(QUrl.fromLocalFile("sqltabletest.qml"))
view.show()
app.exec()
我的 QML 是
import QtQuick 2.2
import QtQuick.Controls 1.1
TableView {
width: 200
height: 300
model: tabmodel
}
但它什么也没显示,只是一个空白窗口
我可以看到我的QSqlQuery 正在工作,因为我可以使用该查询中的value(n) 方法从数据库中打印数据。我还检查了 rolenames() 成员函数,但最终结果是一样的。
def roleNames(self):
roles = {
Qt.UserRole + 1 : "id",
Qt.UserRole + 2 : "name"
}
return roles
更新:
QSqlQueryModel 适用于小部件类,我已经使用 QTableView 小部件对其进行了测试。但我需要让它与 QML 一起工作。
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QTableView
from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlQueryModel
app = QApplication(sys.argv)
db = QSqlDatabase.addDatabase("QMYSQL")
db.setHostName("localhost")
db.setDatabaseName("qtdb")
db.setUserName("abc")
db.setPassword("xyz")
qry = QSqlQuery()
if db.open():
qry = db.exec("SELECT id, name FROM qttab")
tabmodel = QSqlQueryModel()
tabmodel.setQuery(qry)
tabmodel.setHeaderData(0, Qt.Horizontal, "ID")
tabmodel.setHeaderData(1, Qt.Horizontal, "Name")
tabview = QTableView()
tabview.setModel(tabmodel)
tabview.show()
db.close()
app.exec()
谁能帮我解决这个问题?提前致谢。
【问题讨论】:
-
我认为 roleNames 不应该是静态方法。
-
@fxam 我也尝试过不使用装饰器,使其成为成员方法;同样的结果:(
-
也许你可以从 here 那里得到一些想法,虽然它是针对 PyQt4 的。
-
我已经解决了这个问题,不幸的是,有问题的代码直接继承了
QAbstractItemModel,问题在于rowCount和data方法的实现以及关于从QML访问特定成员.在我的问题中,我继承了QSqlQueryModel类,该类已经实现了data和rowCount。我也没有尝试显式访问该派生类的任何成员。如果我在这里遗漏了什么,你能解释一下吗?
标签: python mysql pyqt qml pyqt5