C++ Qt Lambd表达式在信号连接中的使用
2020 年 05 月 12 日 270 284 字 暂无评论

1.带参数的信号

  • 当我子窗口发送信号待参数时
void SubWidget::sendSlot()
{
    emit mySignal();
    emit mySignal(250,"我爱你");
}
//处理子窗口的信号
    void(SubWidget::*funSignal)() = &SubWidget::mySignal;
    connect(&w,funSignal,this,&MainWidget::dealSub);

    void(SubWidget::*testSignal)(int,QString) = &SubWidget::mySignal;
    connect(&w,testSignal,this,&MainWidget::dealSlot);
  • 为了区分信号重载,用了<u>函数指针</u>的方法进行赋值,区分两个同名信号。
  • 通过来个不同回调函数进行回调

2.Qt4中信号连接

  • 因为Qt5兼容Qt4,所以可以用Qt4的信号连接方式(不建议)
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
  • Qt4信号连接
  • Qt4槽函数必须有slots关键字来修饰
  • SIGNAL SLOT 将函数名字 -> 字符串 不进行错误检查
connect(&w,SIGNAL(mySignal()),this,SLOT(dealSub()));
connect(&w,SIGNAL(mySignal(int,QString)),this,SLOT(dealSlot(int,QString)));

3.Lambda表达式

  • Lambda表达式,匿名函数对象
  • C++11 增加的新特性,项目文件: CONFIG += C++11
  • Qt配合信号一起使用,非常方便
  • 使用Lambda表达式需要在项目文件也就是.pro文件里添加以下代码
CONFIG += C++11

例子

QPushButton *b4 = new QPushButton(this);
b4->setText("Lambda表达式");
b4->move(260,10);
int a = 10;

connect(b4,&QPushButton::released,
            // = : 把外部所有局部变量、类中所有成员以值传递方式
            // this: 类中所有成员以值传递方式
            // & : 把外部所有局部变量,引用符号
            [=]()
    {
        qDebug() << "111111";
        qDebug() << a;
    });
    

注意:

  • 要使用qDebug()需要加上头文件#include <QDebug>
  • Lambda表达式第一个[]可以传入外部成员和变量
  • Lambda表达式第二个()为有返回值的事件函数调用
connect(b4,&QPushButton::clicked,
        [](bool isCheck)
        {
            qDebug() << isCheck;
        });

版权属于:zfh

本文链接:http://zfhblog.com/index.php/archives/45/



评论已关闭