[英]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.2
在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
:
在/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.