отображать данные в выпадающем списке с более чем 256 элементами - PullRequest
1 голос
/ 16 января 2020

У меня есть 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 Ответ

0 голосов
/ 17 января 2020

Удалить relation_model.select().


TL; DR;

В частном API Qt вызывается функция populateDictionary(), которая загружает не более 256 (число мадж c, которое представляется числом строк, полученных в каждой транзакции), поскольку не использует canFetchMore() и fetchMore(). Таким образом, кажется, что OP знает это ограничение, потому что он использует canFetchMore() и fetchMore() для загрузки новых данных, но ошибка состоит в том, чтобы снова вызвать relation_model.select(), который загружает не более первых 256 элементов, исключая эффект canFetchMore() и fetchMore().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...