【用法】信号槽connect的几种写法
1. 多种用法
- 一个信号连多个槽:槽会一个接一个被调用,但顺序不确定
- 多个信号连一个槽:任意信号发出,槽则被调用,用法链接:【QT】多个信号 关联 同一个 槽函数_FourFatCats的博客-CSDN博客_qt多个信号连接到同一个槽函数
- 一个信号连另一个信号:第一个信号发出,第二个信号则发出,初次之外,信号-信号,与信号-槽模式并无区别
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; };
class Reader : public QObject { Q_OBJECT public: Reader() {} void receiveNewspaper(const QString & name) { qDebug() << "Receives Newspaper: " << name; } };
connect(&newspaper,&Newspaper::signalNewPaper, &reader,&Reader::receiveNewspaper);
或
connect(&newspaper, static_cast<void (Newspaper::*)(const QString&)>(&Newspaper::signalNewPaper), [=](const QString& name){/*Your code here*/ });

浙公网安备 33010602011771号