Объявите глобальные строки для использования в файлах qml и cpp - PullRequest
1 голос
/ 21 января 2020

У меня есть около 200 строковых констант, которые я хочу объявить в каком-то файле .h и получить глобальный доступ к моим файлам qml и. cpp в моем проекте Qt. Я смог сделать это с помощью перечислений с помощью Q_NAMESPACE и Q_ENUM_NS (enumName). Как я могу сделать то же самое со строками?

Спасибо

1 Ответ

0 голосов
/ 22 января 2020

Я не знаю, как поступить с глобальным, но вы можете сделать это:

https://doc.qt.io/qt-5/qtqml-cppintegration-definetypes.html#registering - c -type-with-the-qml-type-system

Например, с одной строкой с именем myStr:

class backend_class : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QString myStr READ myStr WRITE myStr NOTIFY myStrChanged ) 

    public: 
        QString myStr() const { return a_myStr ; } 

        void myStr(QString value) { 
            if (a_myStr == value) return; 
            a_myStr = value; 
            emit myStrChanged(value); 
        } 

        Q_SIGNAL void myStrChanged(QString value);

    private: 
        QString a_myStr;
};

В основной. cpp добавить это до загрузки двигателя:

qmlRegisterType<backend_class>(
    "my.cpp.qml.backend", 1, 0, "BackEnd"
    );

И в вашем main.qml добавьте компонент:

BackEnd { id: cpp }

Теперь ваша строка доступна в вашем коде QML следующим образом:

cpp.myStr

Вы можете сделать то же самое со списком:

// funny macro property automation
#define AUTO_PROPERTY(TYPE, NAME) \
    Q_PROPERTY(TYPE NAME READ NAME WRITE NAME NOTIFY NAME ## Changed ) \
    public: \
       TYPE NAME() const { return a_ ## NAME ; } \
       void NAME(TYPE value) { \
          if (a_ ## NAME == value) return; \
          a_ ## NAME = value; \
          emit NAME ## Changed(value); \
        } \
       Q_SIGNAL void NAME ## Changed(TYPE value);\
    private: \
       TYPE a_ ## NAME;

class backend_class : public QObject
{
    Q_OBJECT
    AUTO_PROPERTY( QStringList, strings )

public:
    backend_class() {

        a_strings << QString("Hello");
        a_strings << QString("Hello");
        a_strings << QString("Hello");

    }
};

Обратите внимание, что QStringList будет приведен как массив в QML.

Для более сложного типа используйте это:

https://doc.qt.io/qt-5/qtqml-cppintegration-exposecppattributes.html#properties -with-object -list-types https://code.qt.io/cgit/qt/qtdeclarative.git/tree/examples/qml/referenceexamples/properties?h=5.14

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