Qml与C++交互3: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
调用。
2、Qml控件增加objectName
属性
Button {
text: "Quit";
objectName: "mybutton";
}
增加objectName
属性,是为了在C++中能通过objectName
属性名称找到对应的qml
控件实例。
3、C++找到Qml控件实例
auto root = engine.rootObjects();
auto button = root.first()->findChild<QObject*>("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: "<<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”,获取资源链接。有任何疑问也可以公众号里留言咨询。
更多资讯、知识,微信公众号搜索:“上官宏竹”。