![](/img/trans.png)
[英]I need to Intergate my c++ code and qml. But I get errors "undefined reference to `Middlemen::staticMetaObject'" among many on using qmlRegisterType
[英]Export QFlags with QML (Qt 5) - errors with staticMetaObject
我一直在尝试导出一些QFlags用于QML(主要是从QML中公开的对象的属性中读取它们),但即使遵循这个SO问题,我仍然会遇到编译器错误:
#ifndef HOLIDAYACTIVITIES_H
#define HOLIDAYACTIVITIES_H
#include <QObject>
#include <QMetaType>
#include <QPair>
#include <QObject>
#include <QDateTime>
#include <QGeoLocation>
namespace HolidayPlanner
{
class Holiday: public QObject {
Q_OBJECT
Q_ENUMS(ActivityType)
Q_ENUMS(TransportType)
public:
explicit Holiday(QObject* parent = 0);
virtual ~Holiday();
enum ActivityType {
Transportation = 1,
Lodging = 2,
Sights = 4,
Note = 8,
Food = 16
};
enum TransportType {
Flight = 1,
Train = 2,
Subway = 4,
Bus = 8,
Foot = 16,
Other = 32,
None = 64
};
enum ItemRole {
TypeRole = Qt::UserRole + 1000,
StartDateRole = Qt::UserRole + 1001,
EndDateRole = Qt::UserRole + 1002,
StartPositionRole = Qt::UserRole + 1003,
EndPositionRole = Qt::UserRole + 1004,
TaskRole = Qt::UserRole + 1005,
};
Q_DECLARE_FLAGS(ActivityTypes, ActivityType)
Q_FLAGS(ActivityTypes)
Q_DECLARE_FLAGS(TransportTypes, TransportType)
Q_FLAGS(ActivityTypes)
};
Q_DECLARE_OPERATORS_FOR_FLAGS(Holiday::ActivityTypes)
Q_DECLARE_OPERATORS_FOR_FLAGS(Holiday::TransportTypes)
}; // namespace HolidayPlanner
Q_DECLARE_METATYPE(HolidayPlanner::Holiday::ActivityType)
Q_DECLARE_METATYPE(HolidayPlanner::Holiday::TransportType)
但是当我发出
qmlRegisterType<HolidayPlanner::Holiday::ActivityType>();
我得到了代码中的任何地方
In file included from /usr/include/qt5/QtQml/QtQml:9:0,
from /home/lb/Coding/cpp/holiday-planner/src/holidayactivities.cpp:21:
/usr/include/qt5/QtQml/qqml.h: In instantiation of ‘int qmlRegisterType() [with T =
HolidayPlanner::Holiday::ActivityType]’:
/home/lb/Coding/cpp/holiday-planner/src/holidayactivities.cpp:28:60: required from here
/usr/include/qt5/QtQml/qqml.h:109:5: error: ‘staticMetaObject’ is not a member of
‘HolidayPlanner::Holiday::ActivityType’
QML_GETTYPENAMES
^
/usr/include/qt5/QtQml/qqml.h:119:21: error: ‘staticMetaObject’ is not a member of
‘HolidayPlanner::Holiday::ActivityType’
0, 0, 0, 0, &T::staticMetaObject,
^
这可能有什么问题?
作为参考,像QLocale这样的其他类可以将它们的枚举导出到QML(默认情况下没有完成,但它可以工作),但我找不到任何线索,为什么它在我的情况下不起作用。
您不能将枚举注册为qml类型。 qmlRegisterType<T>()
函数仅适用于从QObject派生的类。 AFAIK注册enumus不是必需的。 他们被视为正常的整体。
为了能够将QVariant
未从QObject
派生的所有其他类型传递给qml,请使用qRegisterMetaType<T>
。 您不能直接在qml中使用它们,但可以传递给C ++槽,属性和可调用方法。
你可能没有正确地做到这一点。 您需要注册包含枚举的类,然后它将自动可用。 这是一个通常如何的例子:
class MyClass : public QObject
{
Q_OBJECT
Q_ENUMS(MyEnum)
Q_PROPERTY(MyEnum myEnum READ myEnum)
public:
enum MyEnum {
Value1 = 0,
Value2
};
explicit MyObject(QObject *parent = 0);
MyEnum myEnum() const;
Q_INVOKABLE MyEnum getMyEnum() const;
};
qmlRegisterType<MyClass>("myclass", 1, 0, "MyClass");
要根据您的特定情况对此进行解释,您将编写如下内容:
qmlRegisterType<Holiday>("holiday", 1, 0, "Holiday");
然后,您将从QML访问枚举值,如下所示:
holiday.Transportation
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.