Я не знаю, как поступить с глобальным, но вы можете сделать это:
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