无法为QML注册命名空间

时间:2020-01-08 15:31:30

标签: c++ qt qml

我正在尝试使用qmlRegisterUncreatableMetaObject注册仅包含名称空间的文件,以便在QML中使用

命名空间在我的constants.h文件中,该文件如下所示:

#ifndef K_CONSTANTS_H
#define K_CONSTANTS_H
#include <QString>
#include <QObject>

static const QString K_Red = "#d20019";
static const QString K_DarkRed = "#a20000";
static const QString K_Green = "#1da019";
static const QString K_DarkGray = "#FF4b4b4b";

static const unsigned int EXIT_CODE_REBOOT = 1234567890;

namespace Strings {
    Q_NAMESPACE
    static const char* REPAIR = QT_TR_NOOP("Repair");
    static const char* MAINTENANCE = QT_TR_NOOP("Maintenance");
    static const char* DISTURBANCE = QT_TR_NOOP("Disturbance");
    static const char* MEAL_BREAK = QT_TR_NOOP("Meal Break");
}

#endif // K_CONSTANTS_H

我试图在K_Administration.cpp的构造函数app.exec()中注册。

qmlRegisterUncreatableMetaObject(Strings::staticMetaObject, "MyConstants", 1, 0, "Strings", "Not Instantiable!" );

这总是导致

k_administration.obj:-1:错误:LNK2001:无法解析的外部符号 “结构QMetaObject const Strings :: staticMetaObject” (?staticMetaObject @ Strings @@ 3UQMetaObject @@ B)

我可以从项目的任何地方访问命名空间。也可以仅调用Strings::staticMetaObject。但是一旦将Strings::staticMetaObject分配给一个值,它似乎就会失败。

也许重要的是要知道K_Administration.cppK_Constants.h在我项目的2个不同子项目中

1 个答案:

答案 0 :(得分:1)

由于K_AdministrationK_Constants在两个不同的项目中,因此有必要添加出口代理。该文件可以位于另一个文件中,也可以位于同一文件中。

#if defined(CONSTANTS_LIBRARY)
#  define CONSTANTS_EXPORT Q_DECL_EXPORT
#else
#  define CONSTANTS_EXPORT Q_DECL_IMPORT
#endif

导出名称空间(将其添加到名称空间是必要的)

CONSTANTS_EXPORT Q_NAMESPACE

注意::我犯了一个错误,我想将CONSTANTS_EXPORT声明添加到名称空间定义行。之所以类似namespace CONSTANTS_EXPORT Strings {},是因为classes有类似的语法。但在namespace中声明了Q_NAMESPACE。我认为可以使用Q_NAMESPACE_EXPORT并在 Qt 5.14 及更高版本中保留出口声明。

相关问题