我有以下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();
}
我遇到编译错误(使用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, from ../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&amp; staticMetaObject; } \ ^ ../ueBlagajnaClient/database/../core/uedatabaseconnectionstatus.h:17:5: 注意:在扩展宏观&#39; Q_ENUM&#39; Q_ENUM(UeTypeDatabaseConnectionStatus) ^ /opt/QtOpenSource55/5.5/gcc_64/include/QtCore/qobjectdefs.h:88:35: 错误:&#39; QMetaObject&#39;既不是功能也不是会员功能;不能 被宣布为朋友 朋友Q_DECL_CONSTEXPR const QMetaObject * qt_getEnumMetaObject(ENUM)Q_DECL_NOEXCEPT {return&amp; staticMetaObject; } \ ^ ../ueBlagajnaClient/database/../core/uedatabaseconnectionstatus.h:17:5: 注意:在扩展宏观&#39; Q_ENUM&#39; Q_ENUM(UeTypeDatabaseConnectionStatus) ^ /opt/QtOpenSource55/5.5/gcc_64/include/QtCore/qobjectdefs.h:88:35: 错误:预期&#39;;&#39;在会员声明结束时 朋友Q_DECL_CONSTEXPR const QMetaObject * qt_getEnumMetaObject(ENUM)Q_DECL_NOEXCEPT {return&amp; staticMetaObject; } \ ^ ../ueBlagajnaClient/database/../core/uedatabaseconnectionstatus.h:17:5: 注意:在扩展宏观&#39; Q_ENUM&#39; Q_ENUM(UeTypeDatabaseConnectionStatus) ^ /opt/QtOpenSource55/5.5/gcc_64/include/QtCore/qobjectdefs.h:88:73: 错误:ISO C ++禁止声明&#39; qt_getEnumMetaObject&#39;没有 输入[-fpermissive] 朋友Q_DECL_CONSTEXPR const QMetaObject qt_getEnumMetaObject(ENUM)Q_DECL_NOEXCEPT {return&amp; staticMetaObject; } \ ^ ../ueBlagajnaClient/database/../core/uedatabaseconnectionstatus.h:17:5: 注意:在扩展宏观&#39; Q_ENUM&#39; Q_ENUM(UeTypeDatabaseConnectionStatus) ^ ../ueBlagajnaClient/database/../core/uedatabaseconnectionstatus.h:In 成员函数&#39; int UeDatabaseConnectionStatus :: qt_getEnumMetaObject(UeDatabaseConnectionStatus :: UeTypeDatabaseConnectionStatus)&#39 ;: /opt/QtOpenSource55/5.5/gcc_64/include/QtCore/qobjectdefs.h:88:101: 错误:无法转换&#39; const QMetaObject *&#39;到&#39; int *&#39;作为回报 朋友Q_DECL_CONSTEXPR const QMetaObject qt_getEnumMetaObject(ENUM)Q_DECL_NOEXCEPT {return&amp; staticMetaObject; } \ ^ ../ueBlagajnaClient/database/../core/uedatabaseconnectionstatus.h:17:5: 注意:在扩展宏观&#39; Q_ENUM&#39; Q_ENUM(UeTypeDatabaseConnectionStatus) ^在/opt/QtOpenSource55/5.5/gcc_64/include/QtQml/QtQml:9:0中包含的文件中, from ../ueBlagajnaClient/main.cpp:1:/opt/QtOpenSource55/5.5/gcc_64/include/QtQml/qqml.h:在实例化中 &#39; int qmlRegisterUncreatableType(const char ,int,int,const char *, const QString&amp;)[与T = UeDatabaseConnectionStatus :: UeTypeDatabaseConnectionStatus]&#39 ;: ../ueBlagajnaClient/main.cpp:35:120:从这里要求 /opt/QtOpenSource55/5.5/gcc_64/include/QtQml/qqml.h:83:59:错误: &#39; staticMetaObject&#39;不是会员 &#39; UeDatabaseConnectionStatus :: UeTypeDatabaseConnectionStatus&#39; const char * className = T :: staticMetaObject.className(); \ ^ /opt/QtOpenSource55/5.5/gcc_64/include/QtQml/qqml.h:134:5:注意:在 扩大宏观&#39; QML_GETTYPENAMES&#39; QML_GETTYPENAMES ^在/opt/QtOpenSource55/5.5/gcc_64/include/QtQml/QtQml:9:0中包含的文件中, from ../ueBlagajnaClient/main.cpp:1:/opt/QtOpenSource55/5.5/gcc_64/include/QtQml/qqml.h:144:51:错误: &#39; staticMetaObject&#39;不是会员 &#39; UeDatabaseConnectionStatus :: UeTypeDatabaseConnectionStatus&#39; uri,versionMajor,versionMinor,qmlName,&amp; T :: staticMetaObject, ^ Makefile:1319:目标&#39; main.o&#39;的配方失败了:*** [main.o]错误1 08:04:15: 过程&#34; / usr / bin / make&#34;退出代码2.错误时 构建/部署项目ueBlagajnaClient(套件:Desktop Qt 5.5.0 GCC 64位)执行步骤&#34;制作&#34;
为什么以及如何摆脱这个错误?我如何滥用方法qmlRegisterUncreatableType
?
答案 0 :(得分:4)
如果您要使用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;