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

时间:2018-04-20 18:48:34

标签: c++ qt qml

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

示例:

// 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文档中描述的内容:Defining QML Types from C++

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

使用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

...

Example.qml

import MyApp 1.0

Text {
    text: SharedConstants.PLATFORM_ARM64
}

Example.cpp

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