天天看點

QML之信号與槽

一、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資料

長風破浪會有時,直挂雲帆濟滄海!

繼續閱讀