行业知识
【QT】重载的信号槽/槽函数做lambda表达式
2026-11-08 20:52:26
来源:互联网转载
重载的信号槽
���数指针:
int fun(int a,long b)
int (*funp)(int, long) = fun;
实现回调函数就需要函数指针
信号重载
派生类槽函数发送两个信号
派生类给父类发两个信号
void (SubWidget::*mysigsub)() = &SubWidget::sigSub; connect(&subw,mysigsub,this,&MainWidget::slotShowMe); void (SubWidget::*mysigsub1)(int,QString) = &SubWidget::sigSub; connect(&subw,mysigsub1,this,&MainWidget::slotSubMsg);
void MainWidget::slotSubMsg(int number, QString str){ qDebug() this-setFixedSize(400,400); this-setWindowTitle("QQ登陆"); this-setWindowIcon(QIcon("/home/yangyu/DailyFILE/picture/52.jpg")); b3 = new QPushButton("登陆",this); b3-resize(80,40); b3->move(300,350); connect(b3,&QPushButton::clicked,this,&MainWidget::slotHideMe); void (SubWidget::*mysigsub)() = &SubWidget::sigSub; connect(&subw,mysigsub,this,&MainWidget::slotShowMe); void (SubWidget::*mysigsub1)(int,QString) = &SubWidget::sigSub; connect(&subw,mysigsub1,this,&MainWidget::slotSubMsg); b4 = new QPushButton("注册",this); b4->resize(80,40); b4->move(20,350); connect(b4,&QPushButton::clicked,this,&MainWidget::slotHideMe_login); connect(&logw,&loginwidget::loginsignal,this,&MainWidget::slotShowMe_login);}MainWidget::~MainWidget(){}void MainWidget::slotForMainWidget(){ b2->setText("注销");}void MainWidget::slotHideMe(){ //隐藏自己,显示QQ邮箱 this->hide(); subw.show();}void MainWidget::slotShowMe(){ show(); subw.hide();}void MainWidget::slotHideMe_login(){ //隐藏自己,显示QQ邮箱 this->hide(); logw.show();}void MainWidget::slotShowMe_login(){ show(); logw.hide();}void MainWidget::slotSubMsg(int number, QString str){ qDebug() //相当于主窗口的一个子窗口 bt1 = new QPushButton(this); bt1-setText("确认"); bt1-resize(0,350); bt2 = new QPushButton(this); bt2-setText("退出"); bt2-resize(80,40); bt2->move(300,350); this->setWindowTitle("QQ邮箱"); this->setFixedSize(400,400); this->setWindowIcon(QIcon("/home/yangyu/DailyFILE/picture/58.jpg")); connect(bt2,&QPushButton::pressed,this,&SubWidget::MySlot);}SubWidget::~SubWidget(){}void SubWidget::MySlot(){ //隐藏自己,显示QQ邮箱 emit sigSub();//发送信号 emit sigSub(520,"666");//发送信号} subwidget.h
#ifndef SUBWIDGET_H#define SUBWIDGET_H#include #include class SubWidget : public QWidget{ Q_OBJECTpublic: explicit SubWidget(QWidget *parent = nullptr); ~SubWidget();signals: void sigSub(); void sigSub(int num,QString str);public slots: //自定义槽函数 void MySlot(); //void MySlot1();private: QPushButton *bt1;//(确认) QPushButton *bt2;//(退出)隐藏自己,显示QQ登陆};#endif // SUBWIDGET_H mainwidget.cpp
#ifndef MAINWIDGET_H#define MAINWIDGET_H#include #include #include "subwidget.h"#include "loginwidget.h"class MainWidget : public QWidget{ Q_OBJECTpublic: MainWidget(QWidget *parent = 0); ~MainWidget(); //自定义槽函数 void slotForMainWidget(); void slotHideMe(); void slotShowMe(); void slotHideMe_login(); void slotShowMe_login(); void slotSubMsg(int number,QString str);private: QPushButton* b1; QPushButton* b2; QPushButton* b3;//(登陆)隐藏自己显示QQ邮箱 QPushButton* b4;//(注册)隐藏自己显示QQ注册 SubWidget subw; loginwidget logw;};#endif // MAINWIDGET_H loginwidget.cpp
#include "loginwidget.h"loginwidget::loginwidget(QWidget *parent) : QWidget(parent){ bt1 = new QPushButton(this); bt1->resize(80,40); bt1->setText("返回"); bt1->move(300,350); this->setWindowTitle("QQ注册"); this->setFixedSize(400,400); connect(bt1,&QPushButton::pressed,this,&loginwidget::loginslots); this->setWindowIcon(QIcon("/home/yangyu/DailyFILE/picture/50.jpg"));}void loginwidget::loginslots(){ emit loginsignal();//发送自定义信号} loginwidget.h
#ifndef LOGINWIDGET_H#define LOGINWIDGET_H#include #include class loginwidget : public QWidget{ Q_OBJECTpublic: explicit loginwidget(QWidget *parent = nullptr);signals://自定义信号 void loginsignal();public slots://自定义槽函数 void loginslots();private: QPushButton *bt1;//上一页};#endif // LOGINWIDGET_H 最终效果
槽函数做lambda表达式
不需要考虑太多,按照下面写
connect(b3,&QPushButton::clicked,this,[=]() { b4->setText("lambda"); }); 如果槽函数很复杂,那就建议使用槽函数。
如果比较简单,可以使用lambda表达式
下一篇:服务器的SN怎么查看?