- 1、C++槽函数实现
- 2、Qml控件增加`objectName`属性
- 3、C++找到Qml控件实例
- 4、连接信号和槽
- 5、自定义带参信号
- Qml自定义信号
- C++槽函数定义
- 信号和槽的连接
- 运行结果
通过将qml中的信号连接到C++对象的槽函数中,完成某些事件的相应。
总体思路:在C++类中增加一个槽函数,然后通过引擎的findChild根据名称查找到对应的qml控件对象指针,然后将qml控件的信号与C++的槽函数连接起来。
1、C++槽函数实现class MyClass : public QObject {
Q_OBJECT
public slots:
void qmlClicked() {
qDebug()<<__FUNCTION__<<" QML signal disposed to here!";
}
}
注意:
- C++类需要继承自QObject对象,并且增加Q_OBJECT的声明。
- C++类中的信号和槽函数不需要声明Q_INVOKABLE宏,也可以被qml调用。
Button {
text: "Quit";
objectName: "mybutton";
}
增加objectName属性,是为了在C++中能通过objectName属性名称找到对应的qml控件实例。
3、C++找到Qml控件实例auto root = engine.rootObjects(); auto button = root.first()->findChild("mybutton");
QT有对象树的概念,所有子对象都挂在了父对象的子对象链表中,root.first()表示qml引擎的第一个根节点(一般都是一个根节点),然后调用模板函数findChild根据objectName找到对应的控件实例。
4、连接信号和槽将qml控件的Button的点击信号clicked与C++中的实例myInfo的槽函数qmlClicked连接起来。
QObject::connect(button, SIGNAL(clicked()), &myInfo, SLOT(qmlClicked()));
信号槽连接后,用户鼠标点击button后,会触发clicked的发送,进而触发qmlClicked的执行。
5、自定义带参信号在qml的Button控件中定义一个信号,然后再定义一个变量count代表单击的次数,在单击Button时发送信号,并带入单击次数。在C++的槽函数中打印单击次数。
Qml自定义信号Button {
...
property int count: 0 // 单击次数
signal myRectsignal(int count) // 定义一个带参数的信号
onClicked: {
count++
myRectsignal(count) // 发射信号
}
}
C++槽函数定义
void MyClass::myRectSlot(int count)
{
qDebug()<<__FUNCTION__<<" count: "<
信号和槽的连接
QObject::connect(button, SIGNAL(myRectsignal(int)), &myInfo, SLOT(myRectSlot(int)));
运行结果
MyClass::myRectSlot count: 1
MyClass::myRectSlot count: 2
MyClass::myRectSlot count: 3
MyClass::myRectSlot count: 4
MyClass::myRectSlot count: 5
完整实现可以微信搜索公众号:“上官宏竹”,或者扫下面的二维码,关注并回复:“qml_3”,获取资源链接。有任何疑问也可以公众号里留言咨询。



