我有一个自定义模型(扩展QAbstractTableModel
),其中实用地添加了行数据。出于性能原因,我使用提取功能(canFetchMore
,fetchMore
)来避免项目不可见时的UI滞后。
当插入新行时,我不想触发QAbstractItemModel::rowsInserted
。但是,如果这些行在视图中可见,我希望它们自动显示。如果用户与视图互动(例如,选择最后一项(视图调用“ canFetchMore”,并且仅当这些项可见时才会调用fetchMore
)。
如何向视图发送信号以显示更多行可显示,但需要获取?
答案 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代码中的注释如何指出您的问题...)