gpt4 book ai didi

c++ - 从另一个模型中提取子模型?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:14:55 26 4
gpt4 key购买 nike

以下代码来自 Qt 演示。这是 QTreeView 的模型。

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

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 类是主要模型。它只包含一个根节点,它包含所有其他子节点。

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,我一次只想显示一层(第一个子级)。当用户点击任何项目时,它应该清除并显示该项目的 child 。我该怎么做?

我的 Qml 代码如下。它显示了所有第一层的 child ,这很棒,但我需要在用户点击某个项目时显示 child 。我的想法是需要提取子模型并指向它,但是如何?

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)
}
}
}
}
}

最佳答案

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

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

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

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

关于c++ - 从另一个模型中提取子模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35025221/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com