一、C++的信號和QML的槽
前言:
Qt中的信號與槽,通常是一個信號SIGNAL和一個槽SLOT,通過connet連接,而QML中不需要再寫槽函數,只需要在合適的地方告訴QML:如果x信號產生則執行x
如有信號:
Class A{ signals: void rcvData(QString str); };
則在QML里:onRcvData:{
//執行x如console.log(str);
}
格式:在信號前面加on,然后信號首字母大寫,注意參數可執行使用
1、如果注冊的是C++類,那么可以在QML中實例化對象的時候直接捕獲
A{
id:a
onRcvData:{
console.log(str)
}
}
2、如果注冊的是C++對象,則需要Connections連接
Connections {
target: a
onRcvData: {
console.log(str)
}
}
二、QML的信號和QML的槽
sendSignal.connect(target.recvSlot)
直接使用connect連接,在合適的地方如Component.onCompleted里連接信號與槽,sendSignal當前對象是定義的信號,recvSlot實際上是一個function
ps
網友總結,轉:http://blog.csdn.net/x356982611/article/details/53871748
簡介
QML 與 C++ 混合編程時,總結了一下qml和c++互相直接調用、及信號與槽連接 的幾種情況,詳細使用情況看示例代碼
所有的QML對象都派生自QObject,不管是可視對象還是集成在c++程序中的對象。一旦QML對象被創建,就可以集成到c++中,讀寫屬性,調用其方法和接收其信號
連接qml中信號與函數
Component.onCompleted:
{
sendMessageSigal.connect(getMessage);
}
連接 qml中函數與c++中信號
Connections
{
//qml 連接 c++ 信號
target:interaction onConnectcppsignal: { label2.text=strMsg; } }
qml中直接調用c++函數
onClicked:
{
//qml 調用 c++函數
interaction.test(); }
連接c++中函數與qml中信號
QObject* quitButton = root->findChild<QObject*>("quitButton");
if (quitButton) { QObject::connect(quitButton, SIGNAL(clicked()), &app, SLOT(quit())); }
c++中直接調用qml中函數
QObject* textLabel = root->findChild<QObject*>("objNameL4");
if (textLabel) { QMetaObject::invokeMethod(textLabel, "setL4text"); }
c++連接信號與槽函數
QObject::connect(this,&CInteraction::valueChanged,this,&CInteraction::setValue); //qt5 新語法
c++ 連接信號與普通函數
QObject::connect(this,&CInteraction::valueChanged,outPutInfo);
c++ 連接信號與lambda函數
QObject::connect(this,&CInteraction::valueChanged,[=,this](){ qDebug()<<"lambda called, value:"<<this->value_<<"\n"; });