一、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
簡介
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中信号
#include <QQuickItem>
//指定對象
QObject* quitButton = root->findChild<QObject*>("quitButton");
if (quitButton){
QObject::connect(quitButton, SIGNAL(clicked()), &app, SLOT(quit()));
}
#include <QQuickItem>
//根對象
QObject *root = ui->quickWidget_lianlutongxin->rootObject();
if (root){
QObject::connect(root, SIGNAL(beginTest(int, bool)), this, SLOT(beginTestSlot(int, bool)));
}
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"; });
ps:
1、隻能傳遞基本的qml資料
長風破浪會有時,直挂雲帆濟滄海!