首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Q_GADGET可以是其他Q_GADGET的属性吗?

Q_GADGET可以是其他Q_GADGET的属性吗?
EN

Stack Overflow用户
提问于 2018-08-30 02:23:27
回答 1查看 870关注 0票数 2

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

代码语言:javascript
复制
Currency& operator=(const Currency& that) = default;

currency.h:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-30 03:52:39

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

代码语言:javascript
复制
QMetaProperty::read: Unable to handle unregistered datatype 'Currency' for property 'Money::currency'
qml: Money(12345, )

根据docs的说法

...

属性类型可以是QVariant支持的任何类型,也可以是用户定义的类型。在此示例中,类QDate被视为用户定义的类型。

..。

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

代码语言:javascript
复制
class Currency
{
    ...
};

Q_DECLARE_METATYPE(Currency)

完整的示例可以在以下link中找到。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52083923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档