QML TreeView 是不是支持模型发出的信号 layoutChanged?

Posted

技术标签:

【中文标题】QML TreeView 是不是支持模型发出的信号 layoutChanged?【英文标题】:Does QML TreeView support signal layoutChanged emitted from model?QML TreeView 是否支持模型发出的信号 layoutChanged? 【发布时间】:2017-10-20 16:31:09 【问题描述】:

我有一个与 QTreeView 配合得很好的模型。在模型中,我实现了如下所示的排序:

void SimpleTreeModel::sort(Node* sortedNode)

     emit layoutAboutToBeChanged(QList<QPersistentModelIndex>(), VerticalSortHint);
     QModelIndexList oldIndices = persistentIndexList();

     Node::SortType sortType = Node::Down;

     //sort starting node
     sortedNode->sortChildren(sortType);

     QModelIndexList newIndices;
     newIndices.reserve(oldIndices.size());
     for(const auto &i : oldIndices)
     
         Node* node = const_cast<Node*>(nodeFromIndex(i));
         QModelIndex index = indexFromNode(node);
         newIndices.push_back(index);
     
     changePersistentIndexList(oldIndices, newIndices);

     QModelIndex startingIndex = indexFromNode(sortedNode);
     emit layoutChanged( QPersistentModelIndex(startingIndex) , VerticalSortHint);

当我调用这个函数时,QTreeView 会更新视图,但 QML 中的 TreeView 不会这样做。 QML TreeView 用法:

TreeView

    model: treeModel
    TableViewColumn 
    
        title: "Title"
        role: "title"
        width: 700
    

我做错了什么?为什么排序后视图不更新元素的布局?

【问题讨论】:

【参考方案1】:

我认为您需要委托树视图项。数据提供给委托。

尝试通过添加 itemDelegate

更改您的 QML TreeView,如下所示
TreeView

    model: treeModel

    itemDelegate: Item 
       Text 
               color: styleData.textColor
               text: styleData.value
            
    

    TableViewColumn 
    
        title: "Title"
        role: "title"
        width: 700
    

查看下面的链接以了解委托在模型和 QML 视图之间的重要性。有一张图片很容易解释。

http://doc.qt.io/qt-5/qtquick-modelviewsdata-modelview.html

Delegate - 规定数据在视图中的显示方式。这 委托获取模型中的每个数据并对其进行封装。数据是 可通过委托访问。

【讨论】:

感谢您的回答。但我不明白这应该有什么帮助。问题是 TreeView 不响应来自模型的信号。看了TreeView的源码,并没有在里面找到负责响应model.layoutChanged信号的函数。这让我很困惑。 @strelok.ndv 查看此链接,您将看到一张图片以及如何在 QML 视图和模型之间进行通信。doc.qt.io/qt-5/qtquick-modelviewsdata-modelview.html 不,我同意strelok.ndv,委托与问题无关

以上是关于QML TreeView 是不是支持模型发出的信号 layoutChanged?的主要内容,如果未能解决你的问题,请参考以下文章

这是 QML 中最小可行的 TreeView 模型吗?

为 QML TreeView 创建模型

QML 创建 TreeView 动态模型的正确方法是啥?

QML TreeView 的 C++ 模型

将数据添加到 QML TreeView

在启动应用程序时发出 qml 信号