【问题标题】:How to pass enum class to QML?如何将枚举类传递给 QML?
【发布时间】:2016-05-24 13:45:35
【问题描述】:

我正在使用 Qt 学习 QML,但在将 enum class 传递给 qml 时遇到了一些麻烦。

当我使用带有int 参数的信号时 - 没关系,代码可以完美运行。

但是,这里有麻烦,如果我使用带有一些 enum class 参数的信号,我在 qml 信号处理程序中有 undefined 值。我试图通过qmlRegisterType 注册enum class,但它不起作用。我将不胜感激。

代码如下:

一些 Helper

class Helper : public QObject
{
    Q_OBJECT
    Q_ENUMS(Requester)
    Q_ENUMS(JANSWER)

public:

enum class Requester {
    ReqLogin,
    ReqNull,
    ReqSave,
    ReqError,
    ReqUnknown
};

enum class JANSWER {
    OK,
    Complete,
    Error,
    Unknown
};

};

ma​​in.cpp

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    qmlRegisterType<JsonPackWorker>("com.jsonpackworker", 1, 0, "JsonPackWorker");
    qmlRegisterType<Helper>("com.Helper", 1, 0, "Helper");

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

JsonPackWorker.h

class JsonPackWorker : public QObject
{
    Q_OBJECT
public:
    <...>

signals:    
    <...>
    void sendAnswer(Helper::Requester req, Helper::JANSWER answer);

public slots:
    <...>
};

JsonPackWorker.cpp 中的某处

emit sendAnswer(Helper::Requester::ReqNull, Helper::JANSWER::OK);

ma​​in.qml

<...>
import com.jsonpackworker 1.0
import com.Helper 1.0

ApplicationWindow {
    id: mainWindow

    // Requests in answers
    property int reqLogin: Helper.ReqLogin

    <...>

    JsonPackWorker {
        id: packWorker
        <...>
        onSendAnswer: {
            // Here I've got undefined undefined if there enum class parameters
            console.log(req + " " + answer)
            switch(req) {
            case reqLogin: loginDial.checkLogin(answer)
                break;
            default:
            }
        }
    }

}

【问题讨论】:

  • 如何它不起作用?你有构建错误吗?运行时崩溃?出乎意料的结果?还有什么?请详细说明。如果您还没有这样做,请read about how to ask good questions
  • enum class改成enum能用吗?
  • @Joachim Pileborg,我写道,我在处理程序中有一个未定义的值。代码显示 console.log() 我用描述评论了该部分。
  • @coyotte508,如果我将enum class 更改为enum,我应该将我的信号更改为void sendAnswer(int req, int answer);,它会完美运行。但这不是有趣的方式。
  • 对于它的价值,它在枚举属于 JsonPackWorker 类本身时起作用。至于为什么在使用另一个注册类的枚举时不起作用,我只能假设它是一个错误。

标签: c++ qt enums qml


【解决方案1】:

问题出在Helper 类中(感谢 Qt 社区)。

class Helper {
   ...
};
Q_DECLARE_METATYPE(Helper::Requester)
Q_DECLARE_METATYPE(Helper::JANSWER)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-06
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 2011-08-03
  • 1970-01-01
相关资源
最近更新 更多