Как обновить TreeModel в Qt? - PullRequest
       45

Как обновить TreeModel в Qt?

0 голосов
/ 17 сентября 2018

У меня есть TreeModel, в который загружены некоторые данные.В моем приложении есть переключатель, который при нажатии должен обновить TreeModel новыми данными.

При переключении переключателя я пробовал выполнить следующие действия, но ни один из них не работает:

  • испускать layoutChanged

    emit layoutChanged();
    
  • испускать dataChanged

    emit dataChanged(QModelIndex(), QModelIndex()); 
    

Ссылка от:

Что означает «bottomRight» при использовании dataChanged () с QTreeView в Qt?

  • Рекурсивное посещение каждого узла в дереве и отправка dataChanged

    void TreeView::getLastExpandedState(const QModelIndex& parent)
    {   
        bool isExpand = isExpanded(parent);
        if (!isExpand) {
            return;
        }
        int rows = model()->rowCount(parent);
    
        for (int rowNum = 0; rowNum < rows ; ++rowNum) {
            QModelIndex childIndex = model()->index(rowNum, 0, parent);
            model->emitChange(parent,childIndex);
            getLastExpandedState(childIndex);
        }
    }
    
    void TreeModel::emitChange(const QModelIndex& parent,const QModelIndex& childIndex) {
        emit dataChanged(parent,childIndex);
    }
    

Как это решить?

1 Ответ

0 голосов
/ 17 сентября 2018

Ответ, на который вы ссылаетесь, в лучшем случае сбивает с толку и, вероятно, неверен.

Код вашей модели должен излучать сигнал dataChanged для любого прямоугольника ячеек, в котором изменились данные, возвращаемые методом модели data,См., Например, этот вопрос и ответ, в котором есть некоторые детали.

Обратите внимание, что параметры в сигнале dataChanged не должны быть родительскими и дочерними - они должны быть "topLeft"и" bottomRight ".Они должны иметь одного и того же родителя, а также быть разными.Таким образом, вам не нужно перебирать строки и генерировать сигнал для каждой строки.Вы можете отправить комбинированный сигнал для всех строк, которые изменились.

Но вам нужно отправить сигнал для каждого родителя (где изменились данные), который сигнализирует верхнюю левую ячейку и нижнюю правую ячейку для этого родителя,Таким образом, вы можете в конечном итоге создать индекс для верхней левой ячейки для этого родителя в (0, 0, parent) и другой для нижней правой ячейки в (rows, cols, parent), а затем отправить сигнал для этой пары индексов.

...