2017-01-09 4 views
1

私は多くのアイテムを持つカスタムツリーモデルを持っています。それはトップレベルの下の最初のレベルで1000000以上のアイテムを持っています。 QTreeViewでこのレベルを展開すると、アイテムが表示されていなくても、これらのアイテムのそれぞれについてmodel.hasChildren()が呼び出されます(下にスクロールして表示する必要があります)。問題は、私の関数hasChildren()が特に百万回呼び出されたときに時間がかかることです(PySide/PyQtでは約10秒かかります)。私の質問は次のとおりです。hasChildren()は、項目が拡張可能(子がある場合)であるかどうかを知る必要があるため、hasChildren()が呼び出されることを理解しています。しかし、なぜそれは目に見えないアイテム(私は目に見える範囲内になく、スクロールした後にしか見えないものを意味する)が呼び出されているのですか?私の見解では、アイテムが目に見えるようになるときにだけ呼び出されるべきです。私はsomethigが欠けていますか?QTreeViewは、不可視アイテムの場合でもQAbstractItemModel :: hasChildren()を呼び出します

2)この問題を回避するにはどうすればよいですか?

+0

[モデルサブクラスのリファレンス](https://doc.qt.io/qt-4.8/model-view-programming.html#model-subclassing-reference)の「モデルデータのレイジー集団」セクションを読んでください。 ? – ekhumoro

答えて

0

pyqt docsごとにfetchMore/canFetchMoreをオーバーライドする必要があります。基本的には、ルートを展開すると、fetchMore()が呼ばれ、データ項目のサブセットのみが返されます。ユーザーがスクロールすると、ビューはより多くをフェッチできるかどうかをルートに尋ねます。 yesと答えた場合、fetchMore()が呼び出され、モデルはより多くの項目を返すことができます。これにより、取り出されたツリー項目に対してのみhasChildren()が呼び出されます。

+0

私はデータを少しずつフェッチしようとしましたが、本当に変です。私はそれに関連する別の質問を提起した:http://stackoverflow.com/questions/41684064/canfetchmore-and-fetchmore-are-not-working-as-expected –

関連する問題