1、信号与槽的定义
1.1 Qt信号定义
a)继承QObject或派生类,必须包含Q_OBJECT宏
b)使用关键字signals声明函数,不需要实现
c)使用emit发送信号
1.2 Qt槽定义
a)必须包含Q_OBJECT宏
b)使用关键字[public/protected/private] slots声明函数
c)需要实现声明的函数
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
// 信号
signals:
void printLog(int a);
// 槽
private slots:
void on_pushButton_clicked();
void onPrintLog(int a);
private:
Ui::Widget *ui;
};
1.3 总结
a)信号使用signals声明,不需实现,是public
b)槽public/protected/private slots声明,需要实现
c)信号槽使用connect进行连接
2、信号与槽的三种写法
2.1 SIGNAL/SLOT宏写法
connect(this, SIGNAL(printLog(int)), this, SLOT(onPrintLog(int)));
2.2 函数指针写法
connect(this, &Widget::printLog, this, &Widget::onPrintLog);
2.3 lambda写法
connect(this, &Widget::printLog, this, [=](){
qDebug("this is lambda");
});
2.4 总结
a)函数指针方式,在编译期就可发现错误,也支持隐式转换
b)推荐使用函数指针方式连接信号槽
c)如果信号槽函数有重载,推荐使用宏方式连接
d)对于短小槽函数的调用且功能不被复用,推荐使用lambda
3、信号与槽的自动绑定
3.1 直接使用设计器编辑
3.2 使用“转到槽”连接
3.3 自动绑定语法
void on_<对象名>_<信号名>(信号参数);
例:
void on_pushButton_clicked();
3.4 自动连接的弊端
当对象名、信号名或参数变化时,连接将失效,在编译器没有错误提示
标签:Widget,Qt,void,private,connect,信号,public From: https://blog.csdn.net/2403_88489952/article/details/143921743