QML入门教程02:与C++交互

QML与C++交互分为四步:

  • C++类
  • Q_PROPERTY
  • 注册C++类
  • 调用类

C++类

先继承QObject创建一个类,添加信号槽

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#ifndef PERSON_H
#define PERSON_H

#include <QObject>

class Person : public QObject
{
Q_OBJECT
public:
explicit Person(QObject *parent = nullptr)
: QObject(parent), m_name(""), m_age(0)
{}

/* 为属性提供 getter 和 setter 方法 */
QString getName() const { return m_name; }
void setName(const QString& name) { m_name = name; emit nameChanged(); }

int getAge() const { return m_age; }
void setAge(int age) { m_age = age; emit ageChanged(); }

signals:
/* 信号与属性对应,通过信号通知其他对象属性的变化 */
void nameChanged();
void ageChanged();

private:
QString m_name;
int m_age;
};

#endif // PERSON_H

Q_PROPERTY

在Q_OBJECT下添加Q_PROPERTY然后QML才能调用。

1
2
3
4
Q_OBJECT
/* 使用 Q_PROPERTY 定义交互的属性 */
Q_PROPERTY(QString name READ getName WRITE setName NOTIFY nameChanged)
Q_PROPERTY(int age READ getAge WRITE setAge NOTIFY ageChanged)

注册类

上下文注入

1
2
3
4
5
6
7
// 创建Person对象
Person person;

QQmlApplicationEngine engine;

/* 将Person对象作为QML上下文属性 */
engine.rootContext()->setContextProperty("person", &person);

qmlRegisterType

1
2
/* 将自定义 C++ 类型注册到 QML 中的函数 */
qmlRegisterType<Person>("com.example", 1, 0, "Person");

调用类

在qml文件中调用类

上下文注入

如果类是以上下文注入的方式使用,那么对象名就是qml中使用的方式。

调用person的age获取/赋值,类中的具体调用由Q_PROPERTY实现。

1
2
3
4
5
6
Slider {
from: 0
to: 100
value: person.age // 与Person对象的age属性绑定
onValueChanged: person.age = value // 当滑块值改变时,更新Person对象的age属性
}

qmlRegisterType

如果想捕获C++类的信号,需要先import类,类名就是Person

1
2
3
4
5
6
7
8
9
10
11
12
13
import com.example 1.0

/* Connections 组件用于连接 Person 的 onMySignal 信号 */
Connections {
target: Person
onNameChanged: console.log("Received nameChanged from C++")
}

Person {
id: person
/* 将 onNameChanged 信号传递到 sendToCpp信号上,便于 QML 处理 */
onNameChanged: console.log("Received nameChanged from C++")
}

QML入门教程02:与C++交互
https://blog.jackeylea.com/qt/qml/how-to-use-cpp-with-qml/
作者
JackeyLea
发布于
2024年12月24日
许可协议