отображать данные в поле со списком с более чем 256 элементами
У меня есть QSqlRelationalTableModel со связанной таблицей с более чем 256 строками. Отношение работает идеально, у меня в столбце 1 есть соответствующие значения из "Relations_table"
Но отображение данных в поле со списком и отправка в базу данных путем выбора в поле со списком работает только для первых 256 строк.
При добавлении значения выше 256 к базе данных вручную связанное значение не отображается в поле со списком, но в табличном представлении соотношение правильное.
В противном случае отображает нажатие на поле со списком все элементы в списке поля со списком.
У меня есть данные из базы данных 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 строками!
Как я могу получить правильно работающее поле со списком, которое отображает отношение для всех связанных элементов?
1 ответ
Удалить relation_model.select()
.
TL; DR;
В частном API Qt populateDictionary()
вызывается функция, которая загружает максимум 256 (магическое число, которое, кажется, является количеством строк, полученных в каждой транзакции) строк, поскольку она не использует canFetchMore()
а также fetchMore()
. Кажется, что OP знает это ограничение, потому что он используетcanFetchMore()
а также fetchMore()
чтобы загрузить новые данные, но ошибка заключается в повторном вызове relation_model.select()
загружает не более 256 первых элементов, устраняя эффект canFetchMore()
а также fetchMore()
.