声明要在 qml 和 cpp 文件中使用的全局字符串

Declare global strings for use in qml and cpp files

本文关键字:全局 字符串 文件 qml cpp 声明      更新时间:2023-10-16

我有大约 200 个字符串常量,我想在某个 .h 文件中声明这些常量,并在我的 qml 和 Qt 项目中的 .cpp 文件中全局访问。我已经能够通过使用 Q_NAMESPACE 和 Q_ENUM_NS(enumName( 来使用枚举来做到这一点。我怎样才能用字符串做类似的事情?

谢谢

我不知道如何处理全局,但你可以这样做:

https://doc.qt.io/qt-5/qtqml-cppintegration-definetypes.html#registering-c-types-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