组合框中的映射数据与超过 256 个项目的关系
map data in combobox with relation with more than 256 items
我有一个 QSqlRelationalTableModel,其相关 table 超过 256 行。
该关系工作完美,我在第 1 列中有来自 "relation_table"
的相关值
但是映射组合框中的数据并通过在组合框中选择提交到数据库,仅适用于前 256 行。
手动将大于 256 的值添加到数据库,相关值未映射到组合框,但在 table视图中关系正确。
否则显示单击组合框时组合框列表中的所有项目。
我有来自具有以下结构的 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_())
要测试上面示例中的问题,您必须填写 table "rel_table" 超过 256 行!
我怎样才能得到一个正确工作的组合框,显示所有相关项目的关系?
移除 relation_model.select()
.
TL;博士;
在private Qt API中,调用了populateDictionary()
函数,最多只加载256(幻数,好像是每笔交易获得的行数)行,因为它不使用 canFetchMore()
和 fetchMore()
。因此,OP 似乎知道该限制,因为它使用 canFetchMore()
和 fetchMore()
来加载新数据,但错误是再次调用 relation_model.select()
最多加载前 256 个元素,从而消除了canFetchMore()
和 fetchMore()
.
的效果
我有一个 QSqlRelationalTableModel,其相关 table 超过 256 行。 该关系工作完美,我在第 1 列中有来自 "relation_table"
的相关值但是映射组合框中的数据并通过在组合框中选择提交到数据库,仅适用于前 256 行。
手动将大于 256 的值添加到数据库,相关值未映射到组合框,但在 table视图中关系正确。
否则显示单击组合框时组合框列表中的所有项目。
我有来自具有以下结构的 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_())
要测试上面示例中的问题,您必须填写 table "rel_table" 超过 256 行!
我怎样才能得到一个正确工作的组合框,显示所有相关项目的关系?
移除 relation_model.select()
.
TL;博士;
在private Qt API中,调用了populateDictionary()
函数,最多只加载256(幻数,好像是每笔交易获得的行数)行,因为它不使用 canFetchMore()
和 fetchMore()
。因此,OP 似乎知道该限制,因为它使用 canFetchMore()
和 fetchMore()
来加载新数据,但错误是再次调用 relation_model.select()
最多加载前 256 个元素,从而消除了canFetchMore()
和 fetchMore()
.