如何在Qt中刷新TreeModel?

时间:2018-09-17 15:46:21

标签: qt qtreeview qabstractitemmodel

我有一个TreeModel,里面装有一些数据。我的应用程序中有一个单选按钮,单击该按钮应使用新数据更新TreeModel

我在切换单选按钮时尝试了以下操作,但均无作用:

  • 发出layoutChanged

    emit layoutChanged();
    
  • 发出dataChanged

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

引用自:

What does 'bottomRight' mean when using dataChanged() with a QTreeView in 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 :(得分:1)

您引用的答案充其量是令人困惑的,而且可能是错误的。

您的模型代码需要针对模型dataChanged方法返回的数据已更改的任何矩形单元格发出data信号。例如,请参见this问答,其中有一些细节。

请注意,dataChanged信号中的参数不应为父项和子项,而应为“ topLeft”和“ bottomRight”。他们需要有相同的父母,也必须有所不同。因此,您无需遍历行并为每一行发出信号。您可以为所有已更改的行发送组合信号。

但是您确实需要为每个父级(数据已更改)发送一个信号,以信号通知该父级的左上单元格和右下单元格。因此,您可能最终在(0, 0, parent)处为该父级的左上角单元格创建了一个索引,并在(rows, cols, parent)处为右下角单元格创建了另一个索引,然后为该对索引发送信号。