簡體   English   中英

將C ++自定義類型暴露給QML

[英]exposing c++ custom type to QML

我有以下C ++自定義對象,希望在QML中將其用作enum類型:

#include <QtQml>
#include <QApplication>
#include <QQmlApplicationEngine>

#include "database/uepeoplemodel.h"
#include "core/uestatus.h"
#include "core/uedatabaseconnectionstatus.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QQmlApplicationEngine engine;

    UeStatus* ueApplicationStatus=new UeStatus(qApp);
    UePeopleModel* uePeopleModel=new UePeopleModel(qApp);

    QObject::connect(uePeopleModel,
                     SIGNAL(ueSignalDatabaseConnectionChanged(UeDatabaseConnectionStatus::UeTypeDatabaseConnectionStatus)),
                     ueApplicationStatus,
                     SLOT(ueSignalDatabaseConnectionChanged(UeDatabaseConnectionStatus::UeTypeDatabaseConnectionStatus)));

    uePeopleModel->ueConnectToDatabase();

    engine.rootContext()->setContextProperty("uePeopleModel",
                                             uePeopleModel);
    engine.rootContext()->setContextProperty("ueApplicationStatus",
                                             ueApplicationStatus);
    engine.addImageProvider(QLatin1String("uePeopleModel"),
                            uePeopleModel);

    qmlRegisterUncreatableType<UeDatabaseConnectionStatus::UeTypeDatabaseConnectionStatus>("si.mikroelektronika",
                                                                                           1,
                                                                                           0,
                                                                                           "UeTypeDatabaseConnectionStatus",
                                                                                           "Database Connection Status");

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

    return app.exec();
}

我收到以下編譯錯誤(在Linux work002 3.19.0-28-generic #30-Ubuntu SMP Mon Aug 31 15:52:51 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux上使用gcc version 4.9.2Linux work002 3.19.0-28-generic #30-Ubuntu SMP Mon Aug 31 15:52:51 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

在/opt/QtOpenSource55/5.5/gcc_64/include/QtCore/qobject.h:40:0中包含的文件中,從/opt/QtOpenSource55/5.5/gcc_64/include/QtCore/qabstractanimation.h:37,從/ opt / QtOpenSource55中包含/5.5/gcc_64/include/QtCore/QtCore:4,來自/opt/QtOpenSource55/5.5/gcc_64/include/QtQml/QtQmlDepends:3,來自/opt/QtOpenSource55/5.5/gcc_64/include/QtQml/QtQml:3,來自../ueBlagajnaClient/main.cpp:1:/opt/QtOpenSource55/5.5/gcc_64/include/QtCore/qobjectdefs.h:88:5:錯誤:可能未將類定義聲明為好友Q_DECL_CONSTEXPR const QMetaObject * qt_getEnumMetaObject(ENUM )Q_DECL_NOEXCEPT {return&staticMetaObject; } \\ ^ ../ueBlagajnaClient/database/../core/uedatabaseconnectionstatus.h:17:5:注意:擴展宏'Q_ENUM'Q_ENUM(UeTypeDatabaseConnectionStatus)^ /opt/QtOpenSource55/5.5/gcc_64/include/QtCore/ qobjectdefs.h:88:35:錯誤:“ QMetaObject”既不是函數也不是成員函數; 無法聲明為朋友Q_DECL_CONSTEXPR const QMetaObject * qt_getEnumMetaObject(ENUM)Q_DECL_NOEXCEPT {return&staticMetaObject; } \\ ^ ../ueBlagajnaClient/database/../core/uedatabaseconnectionstatus.h:17:5:注意:擴展宏'Q_ENUM'Q_ENUM(UeTypeDatabaseConnectionStatus)^ /opt/QtOpenSource55/5.5/gcc_64/include/QtCore/ qobjectdefs.h:88:35:錯誤:預期為';' 在成員聲明朋友Q_DECL_CONSTEXPR常量QMetaObject * qt_getEnumMetaObject(ENUM)Q_DECL_NOEXCEPT結束時{return&staticMetaObject; } \\ ^ ../ueBlagajnaClient/database/../core/uedatabaseconnectionstatus.h:17:5:注意:擴展宏'Q_ENUM'Q_ENUM(UeTypeDatabaseConnectionStatus)^ /opt/QtOpenSource55/5.5/gcc_64/include/QtCore/ qobjectdefs.h:88:73:錯誤:ISO C ++禁止聲明沒有類型的“ qt_getEnumMetaObject” [-fpermissive]朋友Q_DECL_CONSTEXPR const QMetaObject qt_getEnumMetaObject(ENUM)Q_DECL_NOEXCEPT {return&staticMetaObject; } \\ ^ ../ueBlagajnaClient/database/../core/uedatabaseconnectionstatus.h:17:5:注意:在宏“ Q_ENUM”的擴展中Q_ENUM(UeTypeDatabaseConnectionStatus)^ ../ueBlagajnaClient/database/../core/uedatabaseconnectionstatus .h:在成員函數'int UeDatabaseConnectionStatus :: qt_getEnumMetaObject(UeDatabaseConnectionStatus :: UeTypeDatabaseConnectionStatus)'中:/opt/QtOpenSource55/5.5/gcc_64/include/QtCore/qobjectdefs.h:88:101:錯誤:無法轉換'const QMetaObject *'返回朋友Q_DECL_CONSTEXPR const QMetaObject中的'int *'。 Qt_getEnumMetaObject(ENUM)Q_DECL_NOEXCEPT {return&staticMetaObject; } \\ ^ ../ueBlagajnaClient/database/../core/uedatabaseconnectionstatus.h:17:5:注意:擴展宏'Q_ENUM'Q_ENUM(UeTypeDatabaseConnectionStatus)^在/opt/QtOpenSource55/5.5/gcc_64/ include / QtQml / QtQml:9:0,來自../ueBlagajnaClient/main.cpp:1:/opt/QtOpenSource55/5.5/gcc_64/include/QtQml/qqml.h:實例化為'int qmlRegisterUncreatableType(const char ,int ,int,const char *,const QString&)[with T = UeDatabaseConnectionStatus :: UeTypeDatabaseConnectionStatus]':../ueBlagajnaClient/main.cpp:35:120:此處需要/opt/QtOpenSource55/5.5/gcc_64/include/QtQml/ qqml.h:83:59:錯誤:“ staticMetaObject”不是“ UeDatabaseConnectionStatus :: UeTypeDatabaseConnectionStatus”的成員。const char * className = T :: staticMetaObject.className(); \\ ^ /opt/QtOpenSource55/5.5/gcc_64/include/QtQml/qqml.h:134:5:注意:在擴展宏“ QML_GETTYPENAMES” QML_GETTYPENAMES時^從/opt/QtOpenSource55/5.5/gcc_64/include/QtQml包含的文件中/ QtQml:9:0,來自../ueBlagajnaClient/main.cpp:1:/opt/QtOpenSource55/5.5/gcc_64/include/QtQml/qqml.h:144:51:錯誤:“ staticMetaObject”不是該成員'UeDatabaseConnectionStatus :: UeTypeDatabaseConnectionStatus'uri,versionMajor,versionMinor,qmlName,&T :: staticMetaObject,^ Makefile:1319:目標“ main.o”的配方失敗:*** [main.o]錯誤1 08:04:15 :進程“ / usr / bin / make”以代碼2退出。生成/部署項目ueBlagajnaClient時出錯(套件:Desktop Qt 5.5.0 GCC 64bit)執行步驟“ Make”時

為什么以及如何擺脫此錯誤? 我如何濫用qmlRegisterUncreatableType方法?

如果要使用qmlRegisterType ,則使用的類必須是繼承QObject並具有Q_OBJECT宏的類:

class UeTypeDatabaseConnectionStatus: public QObject
{
    Q_OBJECT

public:
    enum StatusEnum
    {
        NOT_CONNECTED=false,
        CONNECTED=true
    }
    Q_ENUM(StatusEnum)
    ...
}

在QML中,可以像創建其他任何QML類一樣創建它的實例。

編輯:但是,由於您要做的只是使用枚舉值,請改用qmlRegisterUncreatableType 這樣就可以注冊類型,但是您不能創建它的實例。

要訪問枚舉值,請導入類型並像其他枚舉一樣使用它:

connectionProperty: UeTypeDatabaseConnectionStatus.CONNECTED;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM