Qt TreeView 获取总行数,考虑展开和折叠的文件夹
Qt TreeView obtaining number of total rows, expanded and collapsed folders considered
我正在处理一个 Qt 应用程序,我想在其中检索 Directory/Filesystem model-like 树中可导航行的总数。这意味着如果展开文件夹,则添加其计数,如果折叠文件夹,则不添加其计数。总的来说,我希望能够检索已展开和可用的每一行的编号。据我所知,在网上很难找到这样的实现。两个尚未奏效的解决方案:
int MainWindow::countRowsOfIndex_treeview( const QModelIndex & index )
{
int count = 0;
const QAbstractItemModel* model = index.model();
int rowCount = model->rowCount(index);
count += rowCount;
for( int r = 0; r < rowCount; ++r )
count += countRowsOfIndex_treeview( model->index(r,0,index) );
return count;
}
这与我想要实现的目标相去甚远,因为它没有考虑未展开的文件夹。
到目前为止,我一直在使用以下方式处理 one-level 行计数:
ui->treeView->model()->rowCount(ui->treeView->currentIndex().parent())
但是,这还不算未展开的孩子等等。我希望我的问题很清楚。任何帮助表示赞赏。如果需要,我愿意提供更多信息。谢谢
您可以检查您的视图是否扩展了每个索引。那么就只剩下遍历模型的问题了。
库巴教团的功劳:
基于他漂亮的遍历函数:
void iterate(const QModelIndex & index, const QAbstractItemModel * model,
const std::function<void(const QModelIndex&, int)> & fun,
int depth = 0)
{
if (index.isValid())
fun(index, depth);
if (!model->hasChildren(index)) return;
auto rows = model->rowCount(index);
auto cols = model->columnCount(index);
for (int i = 0; i < rows; ++i)
for (int j = 0; j < cols; ++j)
iterate(model->index(i, j, index), model, fun, depth+1);
}
,您可以轻松写下您的需求:
int countExpandedNode(QTreeView * view) {
int totalExpanded = 0;
iterate(view->rootIndex(), view->model(), [&totalExpanded,view](const QModelIndex & idx, int depth){
if (view->isExpanded(idx))
totalExpanded++;
});
return totalExpanded;
}
这样调用代码:
QTreeView view;
view.setModel(&model);
view.setWindowTitle(QObject::tr("Simple Tree Model"));
view.expandAll();
view.show();
qDebug() << "total expanded" << countExpandedNode(&view);
我已经在 Qt TreeModel 示例上快速测试了它,它似乎有效。
我正在处理一个 Qt 应用程序,我想在其中检索 Directory/Filesystem model-like 树中可导航行的总数。这意味着如果展开文件夹,则添加其计数,如果折叠文件夹,则不添加其计数。总的来说,我希望能够检索已展开和可用的每一行的编号。据我所知,在网上很难找到这样的实现。两个尚未奏效的解决方案:
int MainWindow::countRowsOfIndex_treeview( const QModelIndex & index )
{
int count = 0;
const QAbstractItemModel* model = index.model();
int rowCount = model->rowCount(index);
count += rowCount;
for( int r = 0; r < rowCount; ++r )
count += countRowsOfIndex_treeview( model->index(r,0,index) );
return count;
}
这与我想要实现的目标相去甚远,因为它没有考虑未展开的文件夹。
到目前为止,我一直在使用以下方式处理 one-level 行计数:
ui->treeView->model()->rowCount(ui->treeView->currentIndex().parent())
但是,这还不算未展开的孩子等等。我希望我的问题很清楚。任何帮助表示赞赏。如果需要,我愿意提供更多信息。谢谢
您可以检查您的视图是否扩展了每个索引。那么就只剩下遍历模型的问题了。
库巴教团的功劳:
基于他漂亮的遍历函数:
void iterate(const QModelIndex & index, const QAbstractItemModel * model,
const std::function<void(const QModelIndex&, int)> & fun,
int depth = 0)
{
if (index.isValid())
fun(index, depth);
if (!model->hasChildren(index)) return;
auto rows = model->rowCount(index);
auto cols = model->columnCount(index);
for (int i = 0; i < rows; ++i)
for (int j = 0; j < cols; ++j)
iterate(model->index(i, j, index), model, fun, depth+1);
}
,您可以轻松写下您的需求:
int countExpandedNode(QTreeView * view) {
int totalExpanded = 0;
iterate(view->rootIndex(), view->model(), [&totalExpanded,view](const QModelIndex & idx, int depth){
if (view->isExpanded(idx))
totalExpanded++;
});
return totalExpanded;
}
这样调用代码:
QTreeView view;
view.setModel(&model);
view.setWindowTitle(QObject::tr("Simple Tree Model"));
view.expandAll();
view.show();
qDebug() << "total expanded" << countExpandedNode(&view);
我已经在 Qt TreeModel 示例上快速测试了它,它似乎有效。