Найти - Пользователи
Полная версия: странное поведение canFetchMore и fetchMore
Начало » Python для новичков » странное поведение canFetchMore и fetchMore
1
Thundery
Решил попробовать в новом проекте pyqt5 установил на python 3.8.8rc1 pyqt5 5.15.9
И вот дошло до момента когда нужно было в 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 так влияет?

Заранее прошу прощения если что не так. Пишу тут первый раз и с телефона, в коде могут быть опечатки.

Rodegast
> почему один printf так влияет?

Наверное потому что ты с его помощью метод super().canFetchMore(index) дёргаешь 2 раза.

> Я ведь правильно понимаю что вункция ленивой загрузки должна работать из коробке?

С чего ты это взял? Про QSqlQueryModel я не скажу т.к. предпочитал ей не пользоваться, но обычно когда делал такую подгрузку, я в beginInsertRows вставлял нужное количество строк через beginInsertRows и переопределял rowCount что бы он отдавал нужное количество строк.
Thundery
По первому вопросу понял. Не разобрался что она делает.

А что посоветуеш использовать заместо QSqlQueryModel?
QAbstractItemModel?
И что в переопределении rowCount() нужно через QSqlQuery запрос к базе делать?
А зачем тогда QSqlTableModel и QSqlQueryModel существуют?
Rodegast
QSqlQueryModel и прочее это всего лишь надстройка над QAbstractItemModel. С этими надстройками возни больше чем пользы по этому я ими не пользуюсь.

> И что в переопределении rowCount() нужно через QSqlQuery запрос к базе делать?

Насколько помню это от СУБД зависит в каких то он может узнать количество возвращаемых строк, а в каких то нет.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB