gpt4 book ai didi

c++ - Q_GADGET 可以是其他 Q_GADGET 的属性吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:52:20 29 4
gpt4 key购买 nike

当我尝试将 qml 中的此类对象传递给某个 QML 组件属性时,它只是在发布时崩溃或在调试时挂起:

Currency& operator=(const Currency& that) = default;

货币.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

钱.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

工厂.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

主要.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();
}

主.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:

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

最佳答案

我在执行你的代码时得到的错误是:

QMetaProperty::read: Unable to handle unregistered datatype 'Currency' for property 'Money::currency'
qml: Money(12345, )

根据docs :

...
The property type can be any type supported by QVariant, or it can be a user-defined type. In this example, class QDate is considered to be a user-defined type.
...

在您的情况下,QVariant 不支持货币,因此解决方案是使用 Q_DECLARE_METATYPE 来获得 QVariant 的支持:

class Currency
{
...
};

Q_DECLARE_METATYPE(Currency)

完整的例子可以在下面的link中找到.

关于c++ - Q_GADGET 可以是其他 Q_GADGET 的属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52083923/

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