如何将枚举类传递给 QML

How to pass enum class to QML?

本文关键字:QML 枚举      更新时间:2023-10-16

我正在学习使用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
};
};

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

Somewehere in JsonPackWorker.cpp

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

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

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

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