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

时间:2017-10-20 16:31:09

标签: qt treeview qml qabstractitemmodel

我有一个适用于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 个答案:

答案 0 :(得分:0)

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

尝试通过添加 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获取模型中的每个数据并封装它。数据是   通过代表可以访问。