Qt TreeView получает количество рассмотренных строк, развернутых и свернутых папок - PullRequest
0 голосов
/ 16 мая 2018

Я имею дело с приложением Qt, в котором я хотел бы получить общее количество перемещаемых строк в дереве, похожем на модель каталога / файловой системы. Это означает, что если папка расширена, ее счет добавляется, если папка свернута, ее счет не добавляется. В целом, я хочу быть в состоянии получить номер каждой строки, которая развернута и доступна. Насколько я мог видеть, в Интернете нет такой реализации, которую легко найти. Пока два нерабочих решения:

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;
}

Это даже не близко к тому, чего я хочу достичь, так как не учитывает нерасширенные папки.

До сих пор я имел дело с одноуровневым подсчетом строк, используя:

ui->treeView->model()->rowCount(ui->treeView->currentIndex().parent())

Однако это не учитывает нерасширенных детей и так далее. Я надеюсь, что мой вопрос ясен. Любая помощь приветствуется. Я готов предоставить любую дополнительную информацию, если потребуется. Спасибо.

1 Ответ

0 голосов
/ 16 мая 2018

Вы можете проверить свое представление, расширен ли каждый индекс или нет. Тогда это всего лишь вопрос прохождения модели.

Кредит Кубы Заказ: Как зациклить индексы QAbstractItemView?

На основании его приятной функции обхода:

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, похоже, он работает.

...