QSqlQueryModel返回的行数是正确的,但内容都为空
我正在开发一个使用QSqlQueryModel和 QListView的应用。
下面这个是一个为了说明我的问题而极度简化的示例。
运行时,ListView显示的项数是正确的(4个),但它们都是空白的。在 data() 方法中的 print() 全部显示为 None 的值。
使用列号而不是列名也会得到相同的结果。
再加上一个 print(self.record(r).count()),显示出预期的列数(3列)。
如果我在我的数据库浏览器应用中打开数据库文件,所有值都在那里。
我到底在这里做错了什么?
我意识到我的示例更适合 QSqlTableModel,所以把代码改为使用它,但得到的结果还是一样。
from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QApplication, QMainWindow, QListView
from PyQt6.QtSql import QSqlDatabase, QSqlQuery, QSqlQueryModel, QSqlTableModel
class ListModel(QSqlQueryModel):
def __init__(self):
super().__init__()
self.setQuery("SELECT id, name, age FROM people")
def data(self, index, role):
r = index.row()
if role == Qt.ItemDataRole.DisplayRole:
v = self.record(r).value("name")
print("row " + str(r) + " displayrole = " + str(v))
return v
elif role == Qt.ItemDataRole.ToolTipRole:
v = self.record(r).value("age")
print("row " + str(r) + " tooltiprole = " + str(v))
return v
class ListView(QListView):
def __init__(self):
super().__init__()
self.model = ListModel()
self.setModel(self.model)
class ListWindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(300,300)
self.list = ListView()
self.setCentralWidget(self.list)
if __name__ == "__main__":
con = QSqlDatabase.addDatabase("QSQLITE")
con.setDatabaseName("test.db")
con.open()
query = QSqlQuery()
query.exec("CREATE TABLE IF NOT EXISTS people (id INTEGER, name TEXT, age INTEGER, PRIMARY KEY(id AUTOINCREMENT))")
query.exec("DELETE FROM people")
query.exec("INSERT INTO people (name, age) VALUES ('Bob', 42), ('Sue', 38), ('Steve', 21), ('Wendy', 50)")
app = QApplication([])
win = ListWindow()
win.show()
app.exec()
如果我把 data() 方法注释掉,并把 self.setModelColumn(1) 添加到 ListView.__init__,列表就会用名称填充,因此我的数据库和连接确实工作(但我无法获取工具提示,也无法在我的实际代码中完成其他功能)。
我最初把 data() 方法写成如下:
def data(self, index, role):
r = index.row()
rec = self.record(r)
if role == Qt.ItemDataRole.DisplayRole:
v = rec.value("name")
print("row " + str(r) + " displayrole = " + str(v))
return v
elif role == Qt.ItemDataRole.ToolTipRole:
v = rec.value("age")
print("row " + str(r) + " tooltiprole = " + str(v))
return v
但运行时我得到的是无休止重复的 RecursionError。这是为什么?
解决方案
问题在于你只为 DisplayRole 和 ToolTipRole 编写了代码,但这个函数也会对其他角色执行,而它们只能得到 None。
你可能需要对其他角色执行父级 data()。
def data(self, index, role):
# ... your code for DisplayRole and ToolTipRole ...
return super().data(index, role) # for other roles
结果:
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。
