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

Can I use constants from C++ also in QML files?

本文关键字:常量 C++ QML 文件 我可以      更新时间:2023-10-16

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

例:

// constants.h 
extern const std::string HELLO_WORLD;
// constants.cpp
const std::string HELLO_WORLD = "Hello World";

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

有没有一个简单的解决方案来实现这一点,例如:
#inlude constants.h
还是
import constants.h

或者,通过创建一个具有这些常量作为成员的类,然后使该类在 QML 中可访问,这是实现这一目标的唯一可能方法?
(类似于Qt文档中描述的内容:从C++定义QML类型)

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

SharedConstants.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"));
};

MyApp.pro

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

例子.qml

import MyApp 1.0
Text {
text: SharedConstants.PLATFORM_ARM64
}

示例.cpp

#include "SharedConstants.h"
const QString arm = SharedConstants::PLATFORM_ARM32;

您可以使用QVariant 将 C++ 中的值作为上下文属性公开给 QML。

QString testStr("test");
engine.rootContext()->setContextProperty(QStringLiteral("testStr"), QVariant::fromValue(testStr));