文章目录介绍示例标准信号槽使用点击按钮关闭窗口自定义信号槽使用添加两个类声明信号饥饿信号无需定义声明和定义槽函数注册信号槽扩展介绍信号槽实际就是观察者模式发布-订阅。事件的捕捉和信号的发射都是由Qt框架内部实现的。示例标准信号槽使用点击按钮关闭窗口#includemainwindow.h#includeui_mainwindow.hMainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow){ui-setupUi(this);connect(ui-closeBtn,QPushButton::clicked,this,MainWindow::close);}MainWindow::~MainWindow(){deleteui;}connect是进行一个信号槽的注册并不是立马触发事件执行。method槽函数本质上是一个回调函数。是在信号产生后由Qt框架调用。QMetaObject::ConnectionQObject::connect(constQObject*sender,PointerToMemberFunction signal,constQObject*receiver,PointerToMemberFunction method,Qt::ConnectionType typeQt::AutoConnection);参数:-sender:发出信号的对象-signal:属于sender对象,信号是一个函数,这个参数的类型是函数 指针,信号函数地址-receiver:信号接收者-method:属于receiver对象,当检测到sender发出了signal信号,receiver对象调用method方法信号发出之后的处理动作// 参数 signal 和 method 都是函数地址, 因此简化之后的 connect() 如下:connect(constQObject*sender,QObject::signal,constQObject*receiver,QObject::method);自定义信号槽使用下面试验这个逻辑女朋友饿了发出信号我收到信号我去做饭。添加两个类声明信号饥饿信号无需定义声明和定义槽函数其中public后面的slots在qt5版本及以后可以省略。但是留着能更清除看出是槽函数用途。注册信号槽mainwindow.h中增加了两个变量girlFriend和me#ifndefMAINWINDOW_H#defineMAINWINDOW_H#includeQMainWindow#includeme.h#includegirlfriend.hQT_BEGIN_NAMESPACEnamespaceUi{classMainWindow;}QT_END_NAMESPACEclassMainWindow:publicQMainWindow{Q_OBJECTpublic:MainWindow(QWidget*parentnullptr);~MainWindow();private:Ui::MainWindow*ui;GirlFriend*girlFriend;Me*me;};#endif// MAINWINDOW_Hmainwindow.cpp中初始化两个变量并注册信号槽以建立关系#includemainwindow.h#includeui_mainwindow.hMainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow){ui-setupUi(this);connect(ui-closeBtn,QPushButton::clicked,this,MainWindow::close);girlFriendnewGirlFriend;menewMe;//注册信号槽connect(girlFriend,GirlFriend::hungry,me,Me::eat);//发射自定义信号emit girlFriend-hungry();}MainWindow::~MainWindow(){deleteui;}voidMainWindow::hungeySlot(){girlFriend-hungry();}其中emit可以省略。主要增加可读性方便识别 。扩展一个信号可以连接多个槽函数。写多个connect就行槽函数执行顺序随机一个槽函数可以连接多个信号信号可以连接信号进行信号的传递//点击按钮后让女朋友发射饿了的信号。// connect(ui-hungryBtn, QPushButton::clicked, this, MainWindow::hungeySlot);//进行信号的传递connect(ui-hungryBtn,QPushButton::clicked,girlFriend,GirlFriend::hungry);信号槽可以断开使用disconnect。参数和connect相同。