将c ++自定义类型暴露给QML

时间:2015-09-14 11:47:50

标签: c++ qt 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();
}

我遇到编译错误(使用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

1 个答案:

答案 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;