我也可以在 QML 文件中使用 C++ 中的常量吗?

V. *_* L. 4 c++ qt qml

通常,我可以在头文件中声明一个常量并将其定义为源文件。之后,我可以在包含标头的每个文件中使用常量。

例子:

// constants.h 
extern const std::string HELLO_WORLD;

// constants.cpp
const std::string HELLO_WORLD = "Hello World";
Run Code Online (Sandbox Code Playgroud)

现在我想在 QML 文件中使用这些常量。

是否有一个简单的解决方案可以实现此目的,例如:
#inlude constants.h

import constants.h

或者是通过创建一个以这些常量作为成员的类,然后使该类在 QML 中可访问来实现此目的的唯一可能方法?
(类似于 Qt 文档中描述的内容:Defining QML Types from C++

Ton*_*ton 7

使用 Qt 5.15 的新 QML 类型注册和 C++ 17。

共享常量.h

#include <QtQml>

#define SHARED_CONSTANT(type, name, value) \
    static inline const type name = value; \
    Q_PROPERTY(type name MEMBER name CONSTANT)

class SharedConstants : public QObject
{
    Q_OBJECT
    QML_UNCREATABLE("Class only exposes constants to QML.")
    QML_ELEMENT
    QML_SINGLETON

public:
    SHARED_CONSTANT(QString, PLATFORM_ARM64, QStringLiteral("arm64"));
    SHARED_CONSTANT(QString, PLATFORM_ARM32, QStringLiteral("arm"));
    SHARED_CONSTANT(QString, PLATFORM_X64,   QStringLiteral("x64"));
    SHARED_CONSTANT(QString, PLATFORM_X86,   QStringLiteral("x86"));
    SHARED_CONSTANT(QString, PLATFORM_CHPE,  QStringLiteral("chpe"));
};
Run Code Online (Sandbox Code Playgroud)

我的应用程序专业版

...

CONFIG += c++17 qmltypes
QML_IMPORT_NAME = MyApp
QML_IMPORT_MAJOR_VERSION = 1

...
Run Code Online (Sandbox Code Playgroud)

示例.qml

import MyApp 1.0

Text {
    text: SharedConstants.PLATFORM_ARM64
}
Run Code Online (Sandbox Code Playgroud)

示例.cpp

#include "SharedConstants.h"
const QString arm = SharedConstants::PLATFORM_ARM32;
Run Code Online (Sandbox Code Playgroud)