我在 QTreeView 中有一个项目的 QModelIndex。
如何测试这个项目是 QTreeView 中最后一个可见项目?
狐狸示例:
-item1 // expanded
--sub11
--sub12
-item2 // collapsed
--sub21
函数bool isItemVisible( QModelIndex idx );
应该返回true
item2 和false
sub21。
请注意,行可能有不同的高度。
好吧,我为可能的功能制作了以下草图,它将告诉您您的项目是否是树视图层次结构中的最后一个:
函数本身:
bool isItemVisible(QTreeView *view, const QModelIndex &testItem,
const QModelIndex &index)
{
QAbstractItemModel *model = view->model();
int rowCount = model->rowCount(index);
if (rowCount > 0) {
// Find the last item in this level of hierarchy.
QModelIndex lastIndex = model->index(rowCount - 1, 0, index);
if (model->hasChildren(lastIndex) && view->isExpanded(lastIndex)) {
// There is even deeper hierarchy. Drill down with recursion.
return isItemVisible(view, testItem, lastIndex);
} else {
// Test the last item in the tree.
return (lastIndex == testItem);
}
} else {
return false;
}
}
如何使用:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTreeView view;
MyModel model; // The QAbstractItemModel.
view->setModel(&model);
QModelIndex indexToTest = model.index(3, 0); // Top level item (4-th row).
// Start testing from the top level nodes.
bool result = isItemVisible(&view, indexToTest, QModelIndex());
return a.exec();
}
请注意,我没有对这个功能进行深入测试,但我认为它可以正常工作。当然,您可以改进它。
更新:
在讨论了提议的方法之后,我建议以下解决方案,该解决方案将减少函数调用的数量并提高整体性能。
// Returns the last visible item in the tree view or invalid model index if not found any.
QModelIndex lastVisibleItem(QTreeView *view, const QModelIndex &index = QModelIndex())
{
QAbstractItemModel *model = view->model();
int rowCount = model->rowCount(index);
if (rowCount > 0) {
// Find the last item in this level of hierarchy.
QModelIndex lastIndex = model->index(rowCount - 1, 0, index);
if (model->hasChildren(lastIndex) && view->isExpanded(lastIndex)) {
// There is even deeper hierarchy. Drill down with recursion.
return lastVisibleItem(view, lastIndex);
} else {
// Test the last item in the tree.
return lastIndex;
}
} else {
return QModelIndex();
}
}
定义一个变量来跟踪树中最后一个可见项。例如:
static QModelIndex LastItem;
每次扩展或添加/删除树视图项目时更新缓存项目。这可以在连接到 QTreeView 的expanded()
, collapsed()
, :rowsAboutToBeInserted
,rowsAboutToBeRemoved()
信号的插槽中实现,即
..
{
LastItem = lastVisibleItem(tree);
}
最后,要测试一个树视图项,只需将其模型索引与此进行比较,LastItem
而无需再次调用搜索函数。