首页 > 解决方案 > 组合框中的映射数据与超过 256 个项目的关系

问题描述

我有一个带有超过 256 行的相关表的 QSqlRelationalTableModel。关系工作完美,我在第 1 列中有来自“relation_table”的相关值

但映射组合框中的数据并通过在组合框中选择提交到数据库,仅适用于前 256 行。

手动将高于 256 的值添加到 db 中,相关值不会映射到组合框,但在 tableview 中关系正确。

否则显示单击组合框列表中的组合框的所有项目。

我有来自具有以下结构的 SQLITE 数据库的数据:

CREATE TABLE `base_table` ( `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `rel_id` INTEGER);
INSERT INTO `base_table` VALUES (1, 1);
CREATE TABLE "rel_table" ( `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `name` TEXT);
INSERT INTO `rel_table` VALUES (1,'aaa');

这是一个简单的工作示例:

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QDataWidgetMapper, QVBoxLayout,\
    QWidget, QComboBox, QApplication, QTableView, QPushButton
from PyQt5.QtSql import QSqlRelationalTableModel, QSqlRelation,\
    QSqlRelationalDelegate, QSqlDatabase


def submitModel():
    mapper.submit()
    model.submitAll()

app = QApplication(sys.argv)
window = QWidget()

combobox = QComboBox()
tableview = QTableView()
button = QPushButton('submit')
layout = QVBoxLayout()

layout.addWidget(combobox)
layout.addWidget(tableview)
layout.addWidget(button)

con = QSqlDatabase.addDatabase('QSQLITE')
con.setDatabaseName('test_db.sqlite')
con.open()

model = QSqlRelationalTableModel()
model.setTable("base_table")
model.setRelation(1, QSqlRelation("rel_table", "id", "name"))
model.select()

relation_model = model.relationModel(1)
relation_model.setSort(0, Qt.AscendingOrder)

while relation_model.canFetchMore():
    relation_model.fetchMore()

relation_model.select()

combobox.setModel(relation_model)
combobox.setModelColumn(1)

mapper = QDataWidgetMapper()
mapper.setModel(model)
mapper.setItemDelegate(QSqlRelationalDelegate())
mapper.addMapping(combobox, 1)
mapper.toFirst()

tableview.setModel(model)
tableview.setItemDelegate(QSqlRelationalDelegate(tableview))

button.clicked.connect(submitModel)

window.setLayout(layout)
window.setGeometry(300, 300, 250, 300)
window.show()
sys.exit(app.exec_())

要测试上面示例中的问题,您必须在表“rel_table”中填充超过 256 行!

我怎样才能得到一个正确的工作组合框,它显示所有相关项目的关系?

标签: pythonsqlitepyqt5qcomboboxqsqlrelationaltablemodel

解决方案


删除relation_model.select().


TL; 博士;

在私有 Qt API 中,populateDictionary()调用的函数最多仅加载 256 行(似乎是每个事务中获得的行数的幻数)行,因为它不使用canFetchMore()and fetchMore()。因此,似乎 OP 知道该限制,因为它使用canFetchMore()fetchMore()加载新数据,但错误是再次调用relation_model.select()最多加载前 256 个元素,消除了canFetchMore()and的影响fetchMore()


推荐阅读