【Qt笔记】QML与C++双向交互

以下如何实现QML对C++数据的双向访问

C++需要准备的工作

对于每一个变量,需要以下工作:

  • 一个读取函数 (Read) ,用于返回C++的数据给QML
  • 一个写入函数 (Write) ,用于将QML给的数据写进C++的数据中,使用传参
  • 一个通知信号 (Changed) ,在数据交换时执行,用于执行下一步。信号需要在上级cpp文件中做好连接工作
  • 在cpp文件中定义QML能访问的变量
1
2
Q_PROPERTY({Type} {Property_name} READ {Read_function} WRITE {Write_function} NOTIFY {Notify_signal})
//一定注意变量名和QML里面的id不要重复了!!!

注意,Notify_signal函数是由C++发起的信号,然后由QML接受,通知QML相关组件可以更新了。Q_PROPERTY的仨函数大概如下:

1
2
3
4
5
6
7
public:
{Type} {Read_funcition}(){return {value}}
void {Write_function}(const {Type}& newValue){value = newValue}

signals:
void {Notify_signal}()
//信号函数在cpp文件里面不用定义

如果要让QML可以直接访问函数,对于每一个函数需要以下工作

  • 定义该函数,但是要让QML能够访问到该函数
1
Q_INVOKABLE {Return_type} {Function_name}

其中,Q_INVOKABLE使得函数可以被QML访问

QML需要准备的工作

main.cpp里面注册好C++文件

1
engine.rootContext()->setContextProperty("{cpp在QML中的别名}",{cpp类的指针})

将Qt中特有的数据类型转换成C++中可用的Qt数据类型

1
2
3
4
5
6
7
8
9
QObject *obj = new QPushButton;
QPushButton *button = qobject_cast<QPushButton *>(obj);

if (button) {
// 转换成功,可以安全地使用 button
} else {
// 转换失败
}
//就GPT写的🤣

【Qt笔记】QML与C++双向交互
https://学习.fun/ml-note/qt-qmp-c++/
Author
Stephen Zeng
Posted on
November 10, 2024
Licensed under