Qt:将项目插入模型以提示视图重新检查canFetchMore时会发出什么信号?

时间:2018-06-25 19:06:40

标签: qt qtableview qabstractitemmodel qabstracttablemodel qabstractitemview

我有一个自定义模型(扩展QAbstractTableModel),其中实用地添加了行数据。出于性能原因,我使用提取功能(canFetchMorefetchMore)来避免项目不可见时的UI滞后。

当插入新行时,我不想触发QAbstractItemModel::rowsInserted。但是,如果这些行在视图中可见,我希望它们自动显示。如果用户与视图互动(例如,选择最后一项(视图调用“ canFetchMore”,并且仅当这些项可见时才会调用fetchMore)。

如何向视图发送信号以显示更多行可显示,但需要获取?

1 个答案:

答案 0 :(得分:1)

Qt 5.6.1解决方案-未经其他版本测试!

在深入研究QAbstractItemView的来源之后,我发现触发fetchMore的最简单方法是启动QAbstractItemViewPrivate's 内部未公开的文件 {{1 }}。

这在很大程度上取决于实现,并且可能会在将来的Qt版本中更改!

子类化您的fetchMoreTimer派生类(例如QAbstractItemView,...)以访问启动计时器的受保护功能之一:

QListView

现在,将项目添加到模型后,您可以调用class CFetchMoreListView : public QListView { Q_OBJECT public: explicit CFetchMoreListView(QWidget *parent = Q_NULLPTR) : QListView(parent) { } inline void CheckFetchMore() { int mode = 0; switch(mode) { case 0: // works - but I didn't check how much unneccessary updating it performs updateGeometries(); break; case 1: // updates the view allright, but also loads items not currently in view verticalScrollbarValueChanged(verticalScrollBar()->maximum()); break; case 2: // needs at least one item already inserted if(currentIndex().isValid()) { QModelIndex const curr = currentIndex(); currentChanged(curr, curr); } break; case 3: // leads to flicker setVisible(false); rowsInserted(QModelIndex(), 0, 0); setVisible(true); break; } } };

修改

有可能重写view->CheckFetchMore();并仅在新添加的行可见时调用基本实现。
但这似乎也很麻烦。

rowsInserted(...)

(我喜欢Qt代码中的注释如何指出您的问题...)