さて、アイテムがツリー ビュー階層の最後のアイテムであるかどうかを示す可能な関数について、次のスケッチを作成しました。
関数自体:
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
検索関数を再度呼び出さずに、そのモデル インデックスをこれと比較するだけです。