gpt4 book ai didi

c++ - qml : data models in models 中的嵌套列表

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

我正在尝试在 QML 界面中实现嵌套评论系统。我有一个 C++ 模型(从 QAbstractListModel 继承),其中模型中的每个项目返回两个值:一个是 QString,另一个是角色名称为“dataMap”的 QVariantMap。这适用于 QML ListView。现在每个 QVariantMap 包含一个项目“data”,它进一步包含一个 QVariantList“children”。现在这基本上列出了具有相同结构的其他 QVariantMap。我实现这个的想法是在 QML ListView 中使用递归委托(delegate)。下面是我的代码的最简单版本。

ListView{
id: commentsList
anchors.fill: parent
model: commentsModel
delegate: commentsDelegate
}
Component{
id: commentsDelegate
ColumnLayout{
Rectangle{
width: 600
height: 200
Text {
id: bodyText
text: dataMap.body
anchors.centerIn: parent
Component.onCompleted: console.debug(text)
}
}
ListView{
id: childList

property var childModel: dataMap.replies.data.children // QVariantList exposed to QML

x: 15
interactive: false
model: childModel
anchors.fill: parent
delegate: commentsDelegate
}
}
}

我的模型结构如下:

class ListModel : public QAbstractListModel
{
Q_OBJECT
public:
ListModel(){}
explicit ListModel(QObject* parent =0);
~ListModel();


QHash<int, QByteArray> roleNames() const;
QVariant data(const QModelIndex & index, int role) const;
int rowCount(const QModelIndex &parent) const;
void addItem(ListItem item);
void clearModel();
private:
QList<ListItem> m_itemsList;
signals:
void dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight);
};

ListItem 类很简单

class ListItem
{

public:
ListItem(QObject* parent = 0) : QObject(parent) {}
virtual ~ListItem() {}

ListItem(const QString & type, const QVariantMap & dataMap);
QString type() const;
QVariantMap dataMap() const;
private:
QString m_type;
QVariantMap m_dataMap;

现在由于多种原因这种方法不起作用(其中一个原因是属性 dataMapchildModeldata 访问>,它被任何 QML 项类型中的默认属性 data 覆盖)。这个问题有什么可能的解决方案吗?

最佳答案

我目前正在开发一个应用程序,它需要对大量(数亿个对象)树的孤立分支进行可视化。由于它是一棵树,因此它与您的问题非常相似,这是关于嵌套模型的。

我的解决方案是创建一种抽象形式。由于树已经存在并且是一个与 GUI 完全不同的设计层,我使用了一个代理对象,它包含模型类,它附加到可视化的树节点。该模型只是 ListView 访问底层数据的适配器。

该模型提供了一个“对象”和一个“类型”角色,“根”委托(delegate)使用它们为子节点实例化一个 UI 元素,对象角色用于创建一个代理以附加到每个子节点,如此有效,我得到了间接嵌套的模型。

每个委托(delegate)基本上都是一个加载器(虽然不是 Loader QML 元素),它从模型角色接收指向每个对象及其类型的指针,因此它为该类型创建一个代理,并且UI 元素 type + ".qml" 附加到代理作为其数据源。

我不能分享任何代码,但希望你能明白。这种方法听起来有点复杂,但它提供了几个巨大的优势:

  • 只为需要的对象创建繁重的 Qt 对象
  • 多个 UI 元素可以共享同一个代理和模型
  • 单个代表可以创建任意数量的完全不同的 UI 元素
  • 它适用于具有任意数量的具有不同属性的不同类型的树,并且它只使用两个角色来实现它。每个对象都有其独特的 UI 元素,可以通过代理访问底层对象的所有数据。祝你好运,通过动态角色实现这一目标
  • 代理还用于通知每个 UI 每个底层对象数据成员的数据变化

关于c++ - qml : data models in models 中的嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31996279/

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