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

 

 

 

 

 

 

 

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"; });

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM