首页 > 解决方案 > 声明用于 qml 和 cpp 文件的全局字符串

问题描述

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

谢谢

标签: c++qtqml

解决方案


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

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;
};

在 main.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


推荐阅读