И вот дошло до момента когда нужно было в QTableView из SQLite выгрузить 3000 строк.
Короче говоря из 3000 у меня выводится только 257 строк.
Я ведь правильно понимаю что вункция ленивой загрузки должна работать из коробке?
В общем я попытался понять что как работает данная фича в qt или почему у меня не работает и наткнулся на странное поведение. Ну по крайней меня для меня это пока не очевидно.
Создал свою модель:
from PyQt5.QtSql import QSqlQueryModel class VVTableModel(QSqlQueryModel): def __init__(self, parent=None): super().__init__(parent) def canFetchMore (self, index): print("canFetchMore" + super().canFetchMore(index)) print(self.rowCount()) return super().canFetchMore(index) def fetchMore (self, index): print("fetchMore" + super().fetchMore(index)) return super().fetchMore(index)
# -*- coding: utf-8 -*- import sys from PyQt5.QtSql import QSqlDatabase, QSqlQuery from PyQt5.QtWidgets import QApplication, QMainWindow from vv_model import VVTableModel from ui_main_window import Ui_MainWindow class SvMainWindow(QMainWindow): def __init__(self): super(SvMainWindow, self).__init__() self.ui = Ui_MainWindow() self.ui.setupUi(self) def import_(self): db = QSqlDatabase.addDatabase('QSQLITE') db.setDatabaseName('data.db') if not db.open(): QMessageBox.critical(None, "Cannot open database", "Click Cancel to exit.", QMessageBox.Cancel) return False query = QSqlQuery() # выгружаем в таблицу self.my_model = VVTableModel(self) self.my_model.setQuery("SELECT * FROM mytable") self.ui.tb_data.setModel(self.my_model) if __name__ == "__main__": app = QApplication(sys.argv) window = SvMainWindow() window.show() sys.exit(app.exec())
Если данный код запустить то в консоле можно увидеть :
canFetchMore True
511
Если прлскролить вниз то ещё до пишет
canFetchMore True
511
fetchMore None
Если удалить
print("fetchMore" + super().fetchMore(index))
canFetchMore True
256
И после скрола
canFetchMore True
256
canFetchMore True
256
canFetchMore False
257
canFetchMore False
257
И все в обоих случаях дальше таблица не скролица?
Почему так и почему один printf так влияет?
Заранее прошу прощения если что не так. Пишу тут первый раз и с телефона, в коде могут быть опечатки.