Невозможно зарегистрировать пространство имен для QML - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь зарегистрировать файл, включающий только пространство имен с 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: неразрешенный внешний символ "struct QMetaObject const Strings :: staticMetaObject" (? staticMetaObject@Strings@@3UQMetaObject@@B)

Я могу получить доступ к пространству имен из любого места в моем проекте. Также можно позвонить просто Strings::staticMetaObject. но, похоже, он потерпит неудачу, как только значение будет присвоено Strings::staticMetaObject.

Может быть, важно знать, что K_Administration.cpp и K_Constants.h находятся в 2 разных подпроектах моего проекта

1 Ответ

1 голос
/ 16 января 2020

Поскольку 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 и выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...