[英]Can Q_GADGET be the property of other Q_GADGET?
When I tried to pass such object in qml to some QML component property, it's just crashed in release or hung up in debug on: 当我尝试将qml中的此类对象传递给某些QML组件属性时,它只是在发布时崩溃或在调试时挂断了:
Currency& operator=(const Currency& that) = default;
currency.h: currency.h:
#ifndef CURRENCY_H
#define CURRENCY_H
#include <QObject>
class Currency
{
Q_GADGET
Q_PROPERTY(QString name READ getName CONSTANT)
public:
Currency() : name("") {}
Currency(const Currency& that) = default;
Currency& operator=(const Currency& that) = default;
static Currency getUSD() {
return Currency("USD");
}
QString getName() {
return this->name;
}
private:
Currency(const QString& name) : name(name) {}
QString name;
};
#endif // CURRENCY_H
money.h: money.h:
#ifndef MONEY_H
#define MONEY_H
#include <QObject>
#include "currency.h"
class Money {
Q_GADGET
Q_PROPERTY(int amount READ getAmount CONSTANT)
Q_PROPERTY(Currency currency READ getCurrency CONSTANT)
public:
Money() :
Money(0, Currency())
{
}
Money(int amount, const Currency& currency) :
amount(amount),
currency(currency)
{
}
int getAmount() {
return this->amount;
}
Currency getCurrency() {
return this->currency;
}
private:
int amount;
Currency currency;
};
#endif // MONEY_H
factory.h: factory.h:
#ifndef FACTORY_H
#define FACTORY_H
#include <QObject>
#include <QVariant>
#include "money.h"
class Factory : public QObject {
Q_OBJECT
Q_DISABLE_COPY(Factory)
public:
static Factory* instance() {
static Factory factory;
return &factory;
}
Q_INVOKABLE QVariant getMoney() {
return QVariant::fromValue(Money(12345, Currency::getUSD()));
}
private:
explicit Factory(QObject* parent = nullptr) :
QObject(parent)
{
}
};
#endif // FACTORY_H
main.cpp: main.cpp中:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "factory.h"
#include "money.h"
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
qmlRegisterUncreatableType<Money>("test", 1, 0, "Money", "error");
qmlRegisterUncreatableType<Currency>("test", 1, 0, "Currency", "error");
qmlRegisterSingletonType<Factory>("test", 1, 0, "Factory",
[](QQmlEngine* engine, QJSEngine* scriptEngine) -> QObject* {
Q_UNUSED(scriptEngine)
Factory* instance = Factory::instance();
engine->setObjectOwnership(instance, QQmlEngine::ObjectOwnership::CppOwnership);
return instance;
});
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
main.qml: main.qml:
import QtQuick 2.11
import QtQuick.Window 2.11
import test 1.0
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
MyItem {
value: {
var money = Factory.getMoney()
console.log(money)
return money
}
anchors.centerIn: parent
}
}
MyItem.qml: MyItem.qml:
import QtQuick 2.10
import QtQuick.Controls 2.3
Item {
id: root
property var value
width: label.width
height: label.height
Component.onCompleted: {
console.log(root.value)
}
Label {
id: label
text: root.value.currency.name
}
}
The error I get when executing your code is: 执行代码时出现的错误是:
QMetaProperty::read: Unable to handle unregistered datatype 'Currency' for property 'Money::currency'
qml: Money(12345, )
According to the docs : 根据文档 :
...
...
The property type can be any type supported by QVariant, or it can be a user-defined type.属性类型可以是QVariant支持的任何类型,也可以是用户定义的类型。 In this example, class QDate is considered to be a user-defined type.
在此示例中,类QDate被认为是用户定义的类型。
......
In your case Currency is not supported by QVariant
, so the solution is to use Q_DECLARE_METATYPE
to be supported by QVariant
: 在您的情况下,
QVariant
不支持Currency,因此解决方案是使用QVariant
支持的Q_DECLARE_METATYPE
:
class Currency
{
...
};
Q_DECLARE_METATYPE(Currency)
The complete example can be found in the following link . 完整的示例可以在以下链接中找到。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.