qt5-信号和槽
自定义信号和槽
win.h
#ifndef WIN_H #define WIN_H #include <QWidget> #include <QDebug> #include <QPushButton> class Win : public QWidget { Q_OBJECT public: Win(QWidget *parent = nullptr); ~Win(); signals: //信号标记 void sigFunc(void);//自定义信号函数,只需声明,不能写定义 public slots: //槽标记 void slotFunc(void); //自定义槽函数 //槽函数也可以当做普通的成员函数,直接调用 }; #endif // WIN_H
win.cpp
#include "win.h" Win::Win(QWidget *parent) : QWidget(parent) { connect(this,SIGNAL(sigFunc()),this,SLOT(slotFunc()));//信号连接槽函数 emit sigFunc(); //发射信号 } Win::~Win() { } void Win::slotFunc() { qDebug()<<"自定义槽函数"; }
但是信号却没有函数体定义,另外,信号的返回类型都是 void,不要指望能从信号返回什么有用信息
槽可以有参数,但槽的参数不能有缺省值
槽也能够声明为虚函数
信号与槽函数的连接
#include <QApplication> #include <QPushButton> #include <QWidget> #include <QLabel> int main(int argc,char **argv) { QApplication app(argc,argv); QWidget win; win.resize(400,200); QPushButton button("按钮",&win); button.move(10,10); QLabel label("标签",&win); label.move(10,100); win.show(); //实现点击按钮关闭标签 QObject::connect(&button,SIGNAL(clicked(void)),&label,SLOT(close(void)));//信号连接槽函数 return app.exec(); } /* QObject::connect( const QObject *sender, //信号发送对象,可以是QObject的所有子类 const char *signal, //信号函数 const QObject *receiver, //信号接受对象,可以是QObject的所有子类 const char *method, //槽函数 Qt::ConnectionType type = Qt::AutoConnection) //连接类型--枚举类型 参数5:Qt::AutoConnection 根据signal和slot所处的线程自动决定--默认 Qt::DirectConnection 是直接连接。相当于直接调用slot函数 */ /* SIGNAL(信号函数(参数表)) //将信号函数转换为const char* SLOT(槽函数(参数表)) //将槽函数转换为const char* */
一个信号可以同时连接多个槽函数
多个信号可以同时连接到同一个槽函数
两个信号函数可以直接连接
QObject::connect(A1,SIGNAL(sigfunc1(int)),A2,SIGNAL(sigfunc2(int)));
当A1发送信号时,所连接的A2对象的信号也将被发送
断开连接
bool b=disconnect(button,SIGNAL(clicked(void)),this,SLOT(f(void))); //断开连接 //如果连接成功断开,则返回 true;否则返回 false //当所涉及的任何一个对象被销毁时,信号槽连接被移除 //0 可以用作通配符,分别表示“任意信号”、“任何接收对象”或“接收对象中的任何槽”,sender发送者永远不会是0
第五个参数:看 https://www.cnblogs.com/senior-engineer/p/7905822.html
qt5格式
使用SIGNAL和SLOT是qt4格式
win.h
#ifndef WIN_H #define WIN_H #include <QWidget> #include <QPushButton> #include <QDebug> class win : public QWidget { Q_OBJECT public: win(QWidget *parent = nullptr); ~win(); QPushButton* button; public slots: void slotFunc(void); }; #endif // WIN_H
win.cpp
#include "win.h" win::win(QWidget *parent) : QWidget(parent) { this->resize(400,300); button=new QPushButton("确定",this); QObject::connect(button, &QPushButton::clicked,this, &win::slotFunc); } win::~win() { } void win::slotFunc() { qDebug()<<"槽函数"; }
子类注意事项
如果不打钩,会找不到槽函数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)