【无标题】

一、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)
    }
}

注意:在高版本QT5.15中,已经对这种方式进行了改变:

Connections {
    target: button
    function onRcvData() {
        //相关事件        
    }
}

否则报警告:QML Connections: Implicitly defined onFoo properties in Connections are deprecated

二、QML的信号和QML的槽

使用信号的connect函数连接槽【函数】

sendSignal.connect(target.recvSlot)

在合适的地方如Component.onCompleted里连接信号与槽,sendSignal当前对象是定义的信号,recvSlot实际上是一个function

三、汇总

1、连接qml中信号与函数

Component.onCompleted:
{
    sendMessageSigal.connect(getMessage);
}

2、连接 qml中函数与c++中信号

Connections
{
    //qml 连接 c++ 信号
    target:interaction
    onConnectcppsignal:
    {
        label2.text=strMsg;
    }
}

3、qml中直接调用c++函数

onClicked:
{
    //qml 调用 c++函数
    interaction.test();
}

4、连接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)));
}

5、c++中直接调用qml中函数

QObject* textLabel = root->findChild<QObject*>("objNameL4");
if (textLabel)
{
    QMetaObject::invokeMethod(textLabel, "setL4text");
}

6、c++连接信号与槽函数

QObject::connect(this,&CInteraction::valueChanged,this,&CInteraction::setValue); //qt5 新语法

7、c++ 连接信号与普通函数

QObject::connect(this,&CInteraction::valueChanged,outPutInfo);

8、c++ 连接信号与lambda函数

QObject::connect(this,&CInteraction::valueChanged,[=,this](){  qDebug()<<"lambda called, value:"<<this->value_<<"\n"; });

参考:http://blog.csdn.net/x356982611/article/details/53871748

https://www.cnblogs.com/judes/p/11243242.html#:~:text=1%E3%80%81%E8%BF%9E%E6%8E%A5qml%E4%B8%AD%E4%BF%A1%E5%8F%B7%E4%B8%8E%E5%87%BD%E6%95%B0%20Component.onCompleted%3A%20%7B%20sendMessageSigal.connect%20%28getMessage%29%3B%20%7D%202%E3%80%81%E8%BF%9E%E6%8E%A5%20qml%E4%B8%AD%E5%87%BD%E6%95%B0%E4%B8%8Ec%2B%2B%E4%B8%AD%E4%BF%A1%E5%8F%B7,%E4%BF%A1%E5%8F%B7%20target%3Ainteraction%20onConnectcppsignal%3A%20%7B%20label2.text%3DstrMsg%3B%20%7D%20%7D%203%E3%80%81qml%E4%B8%AD%E7%9B%B4%E6%8E%A5%E8%B0%83%E7%94%A8c%2B%2B%E5%87%BD%E6%95%B0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值