【用法】信号槽connect的几种写法

1. 多种用法

2. SIGNAL、SLOT形式

  connect(发送者,SIGNAL(信号),接受者,SLOT(槽函数))

  如:

connect(btnStart,SIGNAL(clicked()), this,SLOT(slotStart()));

3. 指针形式

  connect(发送者,&QMainWindow::信号,接受者,&QMianWindow::槽函数)

  如:

connect(btnStart,&QPushButton::clicked, this,&GameWindow::slotStart);

4. Lamda表达式

  C++11中的Lamda表达式用于定义并创建匿名的函数对象,以简化变成工作。Lamda表达式基本构成如下:

  

   即:[函数对象参数](操作符重载函数参数)mutable或exception ->返回值{函数体}

  • []表示一个Lamda的开始,必须有,不能省略。函数对象参数是传递给编译器,自动生成的函数对象类的构造函数的。函数对象参数只能使用那些到定义Lambda为止时Lambda所在作用范围内可见的局部变量(包括Lambda所在类的this)。有以下形式:
    • 空            没有使用任何函数对象参数
    • =             函数体内可以使用Lamda所在作用范围内所有可见局部变量(包括Lamda所在类的this),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量)
    • &             函数体内可以使用Lamda所在作用范围内所有可见局部变量(包括Lamda所在类的this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部变量)
    • this          函数体内可以使用Lamda所在类的成员变量
    • a              将a按值传递,函数体内不能修改传递进来的a的拷贝。若想修改,可添加mutable修饰符
    • &a            将a按引用传递
    • a,&b         将a按值传递,b按引用传递
    • =,&a,&b    除了a、b按引用传递,其余都按值传递
    • &,a,b         除了a、b按值传递,其余都按引用传递
    int m = 0, n = 0;
    [=] (int a) mutable { m = ++n + a; }(4);
    [&] (int a) { m = ++n + a; }(4);
    [=,&m] (int a) mutable { m = ++n + a; }(4);
    [&,m] (int a) mutable { m = ++n + a; }(4);
    [m,n] (int a) mutable { m = ++n + a; }(4);
    [&m,&n] (int a) { m = ++n + a; }(4);
  • 操作符重载函数参数:用()标识,没有参数时这部分可以省略
  • 可修改标识符:mutable声明,这部分可省略,按值传递时加上修饰,表示可以修改传递进来的拷贝(注意修改的是拷贝,不是本身)
  • 错误抛出提示符:exception声明,这部分可省略,用于指定函数抛出异常,如抛出整数异常,可以使用throw(int)
  • 函数返回值:->返回值类型,当返回void、或者函数体中只有一处reture(此时编译器可自动判断返回值类型)时,这部分可以省略
  • 函数体:用{}标识,函数体的实现,不能省略,但可以为空

  比如有报纸类Newspaper,读者类Reader,当Newspaper有新的时候,通知Reader。

class Newspaper : public QObject
{
    Q_OBJECT

public:
    Newspaper(const QString & name) 
        : m_name(name)
    {}
    void send()
    {
        emit signalNewPaper(m_name);
    }
 
signals:
    void signalNewPaper(const QString &name);
 
private:
    QString m_name;
};
Newspaper类
class Reader : public QObject
{
    Q_OBJECT
 
public:
    Reader() {}
 
    void receiveNewspaper(const QString & name)
    {
        qDebug() << "Receives Newspaper: " << name;
    }
};
Reader类
connect(&newspaper,&Newspaper::signalNewPaper, &reader,&Reader::receiveNewspaper);

connect(&newspaper, static_cast<void (Newspaper::*)(const QString&)>(&Newspaper::signalNewPaper), [=](const QString& name){/*Your code here*/ });

 

 

 

 

QT--信号槽与Lambda表达式_阿尔兹的博客-CSDN博客_信号槽lambda

posted @ 2022-03-21 15:06  hik_wxy  阅读(614)  评论(0)    收藏  举报