gpt4 book ai didi

c++ - 如何使用 Q_PROPERTY 公开自定义对象列表

转载 作者:太空狗 更新时间:2023-10-29 20:20:13 25 4
gpt4 key购买 nike

我有一个非常简单的类,它有两个属性;键和值:

KeyValue.h:

class KeyValue : public QObject
{
Q_OBJECT
Q_PROPERTY(QString key READ getKey WRITE setKey NOTIFY keyChanged)
Q_PROPERTY(QString value READ getValue WRITE setValue NOTIFY valueChanged)

public:
KeyValue(const QString& key, const QString& value, QObject* parent = 0);

signals:
void keyChanged();
void valueChanged();

private:
QString _key;
QString _value;

QString getKey() const;
QString getValue() const;

void setKey(const QString& key);
void setValue(const QString& value);
};
Q_DECLARE_METATYPE(KeyValue)

在另一个类中,我想要一个包含 KeyValue 对象列表的属性,因此我可以将此列表用作 QML 中的模型。

Controller.h

class Controller : public QObject
{
Q_OBJECT
Q_PROPERTY(QList<KeyValue*> items READ getItems NOTIFY itemsChanged)

public:
explicit Controller(QObject* parent = 0);

signals:
void itemsChanged();

private:
QList<KeyValue*> getItems() const;
};

我希望能够通过以下方式在 QML 中使用它:

import QtQuick 2.7
import customqml 1.0

Item{
Controller{
id: controller
}
Repeater{
model: controller.items
Text{
text: modelData.key + ": " + modelData.value
}
}
}

这两个类都在我的 main.cpp 文件中注册:

qmlRegisterType<KeyValue>("customqml", 1, 0, "KeyValue");
qmlRegisterType<Controller>("customqml", 1, 0, "Controller");

上面的代码不起作用,因为我显然不能直接将 QList 公开给 QML。我尝试过使用 QAbstractItemModel 和 QQmlListProperty,但我无法让它工作。谁能指出我正确的方向?

我的主要问题是 Controller 类中 items 属性的类型和 getItems 方法的返回值。

如果有任何不同,我正在使用 Qt 5.9。

最佳答案

注意:

  • 除异常(exception)情况外,getter 和 setter 通常是公共(public)的,因此将其移至公共(public)部分

  • 继承自 QObject 的类不需要 QMetaType,因为当您要传输该类的数据时,会使用指针。

并非所有数据类型都通过 Q_PROPERTY 被 QML 支持,因此一个可能的解决方案是通过已知类导出,例如

  • QList<QObject *> :

class Controller : public QObject
{
Q_OBJECT
Q_PROPERTY(QList<QObject *> items READ getItems NOTIFY itemsChanged)
public:
explicit Controller(QObject *parent = nullptr);
QList<QObject *> getItems() const;
signals:
void itemsChanged();
private:
QList<KeyValue *>key_values_list;
};

...
QList<QObject *> Controller::getItems() const
{
QObjectList l;
for(auto e: key_values_list)
l << e;
return l;
}
  • QVariantList :

class Controller : public QObject
{
Q_OBJECT
Q_PROPERTY(QVariantList items READ getItems NOTIFY itemsChanged)
public:
explicit Controller(QObject *parent = nullptr);
QVariantList getItems() const;
signals:
void itemsChanged();
private:
QList<KeyValue *>key_values_list;
};

...
QVariantList Controller::getItems() const
{
QVariantList l;
for(auto e: key_values_list)
l.append(QVariant::fromValue(e));
return l;
}

其他选项是实现一个模型,下面的例子只展示了一个只读模型:

键值模型.h

#ifndef KEYVALUEMODEL_H
#define KEYVALUEMODEL_H

#include "keyvalue.h"

#include <QAbstractListModel>

class KeyValueModel : public QAbstractListModel
{
Q_OBJECT

public:
explicit KeyValueModel(QObject *parent = nullptr)
: QAbstractListModel(parent)
{
key_values_list = {new KeyValue{"k", "v"}, new KeyValue{"k2", "v2"}};
}
int rowCount(const QModelIndex &parent = QModelIndex()) const override
{
if (parent.isValid())
return 0;
return key_values_list.length();
}
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override
{
if (!index.isValid())
return QVariant();
if(index.row() >= 0 && index.row() < rowCount())
return QVariant::fromValue(key_values_list[index.row()]);
return QVariant();
}
private:
QList<KeyValue* >key_values_list;
};

#endif // KEYVALUEMODEL_H

class Controller : public QObject
{
Q_OBJECT
Q_PROPERTY(KeyValueModel* items READ getItems NOTIFY itemsChanged)
public:
explicit Controller(QObject *parent = nullptr);
KeyValueModel* getItems() const;
signals:
void itemsChanged();
private:
KeyValueModel *model;
};

...
Text{
text: display.key + ": " + display.value
}
...

您可以用类似的方式实现 QQmlListProperty,在文档中有很多示例。

关于c++ - 如何使用 Q_PROPERTY 公开自定义对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52834863/

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