无法为 QML 注册命名空间

Unable to Register Namespace for QML

本文关键字:注册 命名空间 QML      更新时间:2023-10-16

>我正在尝试注册一个仅包含具有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

我正在尝试在调用app.exec()之前调用的K_Administration.cpp构造函数中注册。

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

这总是导致

k_administration.obj:-1:错误:LNK2001:未解析的外部符号 "struct QMetaObject const Strings::staticMetaObject" (?staticMetaObject@Strings@@3UQMetaObject@@B(

我可以从项目中的任何位置访问命名空间。也可以只打电话给Strings::staticMetaObject。但是一旦Strings::staticMetaObject被分配给一个值,它似乎就会失败。

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

由于K_AdministrationK_Constants位于两个不同的项目中,因此有必要添加导出 delcaration。这可以位于其他文件中,也可以包含在同一文件中。

#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及更高版本。