首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从另一个模型中提取子模型?

从另一个模型中提取子模型?
EN

Stack Overflow用户
提问于 2016-01-26 22:25:02
回答 1查看 1.3K关注 0票数 2

下面的代码来自一个Qt演示。这是QTreeView的一个模型。

下面的TreeItem类表示树中的每个节点,它可以有子节点。

代码语言:javascript
运行
复制
class TreeItem
{
public:
    explicit TreeItem(const QList<QVariant> &data, TreeItem *parentItem = 0);
    ~TreeItem();

    void appendChild(TreeItem *child);

    TreeItem *child(int row);
    int childCount() const;
    int columnCount() const;
    QVariant data(int column) const;
    int row() const;
    TreeItem *parentItem();

private:
    QList<TreeItem*> m_childItems;
    QList<QVariant> m_itemData;
    TreeItem *m_parentItem;
};

下面的TreeModel类是主要模型。它只包含一个根节点,其中包含所有其他子节点。

代码语言:javascript
运行
复制
class TreeModel : public QAbstractItemModel
{
    Q_OBJECT

public:
    explicit TreeModel(const QString &data, QObject *parent = 0);
    ~TreeModel();

    QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE;
    Qt::ItemFlags flags(const QModelIndex &index) const Q_DECL_OVERRIDE;
    QVariant headerData(int section, Qt::Orientation orientation,
                        int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
    QModelIndex index(int row, int column,
                      const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
    QModelIndex parent(const QModelIndex &index) const Q_DECL_OVERRIDE;
    int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
    int columnCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;

private:
    void setupModelData(const QStringList &lines, TreeItem *parent);

    TreeItem *rootItem;
};

我使用的是QML,我可以在树中显示这个模型,但是我也想在ListView中显示。

对于ListView,我只想一次显示一个层(第一个子层)。当用户单击任何项目时,应该清除并显示该项子项。我该怎么做?

我的Qml代码在下面。它显示所有的第一层子程序,这是很好的,但我需要显示当用户点击一个项目的孩子。我的想法是需要提取子模型并指向它,但是怎么做呢?

代码语言:javascript
运行
复制
Item {
    width: parent.width
    height: parent.height

    ListView {
        //anchors.top: myImage.bottom
        anchors.fill: parent
        id: list
        spacing: 4
        model: treeModel

        delegate: listDelegate

    }

    Component {
        id: listDelegate
        Rectangle
        {
            id: delegateRect
            height: image.height
            width: 500
            Image {
                id: image
                source: "qrc:/icons/resources/element.ico"

            }

            Text {
                id: t
                anchors.left: image.right
                anchors.leftMargin: 20
                anchors.centerIn: delegateRect

                text: title + "/" + summary
                //text: display
            }

            MouseArea {
                anchors.fill: parent
                onClicked: {

                    list.currentIndex = index

                    console.log("Item clicked, index = " + index)

                    // I think I should change model here to sub model but how do I do it?
                    //list.model = treeModel.data(index) 
                }
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2016-01-27 09:41:23

您应该看看Qt文档http://doc.qt.io/qt-5/qabstractproxymodel.html中的http://doc.qt.io/qt-5/qabstractproxymodel.html和派生类。

代理模型用于映射模型索引(如果您想修改布局,或者对数据进行排序/筛选)和数据处理(修改从源模型数据方法返回的数据)。

您需要做的是添加一个属性来选择新的根(应该是提取模型的根项),并实现这两个方法mapFromSource(const QModelIndex &)mapToSource(const QModelIndex &)。这些方法将提供给视图的模型索引(仅在代理模型中有效)映射到基于当前设置的根属性的源模型有效的模型索引(反之亦然)。

此外,还应该重新实现roleNames()方法,以转发源模型定义的滚动名,以便能够从QML内部访问数据。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35025221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档