我正在尝试使用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.cpp
和K_Constants.h
在我项目的2个不同子项目中
答案 0 :(得分:1)
由于K_Administration
和K_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 及更高版本中保留出口声明。