a)在头文件.h中定义按钮及槽函数
2)在Qt4中,槽函数需要在函数声明前加入slots关键字。
public slots: //QT4的槽函数,必须指定时slots void myMin();
3)在Qt5 中,任何成员函数、static 函数、全局函数和 Lambda 表达式都可以作为槽函数。
public: //QT5的槽函数,也是一个普通的函数 void myClose();
4)执行结果
a)运行界面:
5)总结:
6)工程代码:3_2_1_Qt自定义的信号和槽1.zip
2.自定义信号
ii:怎么使用信号:使用一个按钮的信号,来调用一个槽函数,发送这个信号。
iii:发送信号的槽函数,使用emit来发送这个自定义的信号。
iii:对方怎么接受这个信号:接收信号的方式如下,当检测到,来自silw窗口发出的showBigW信号时,回调用自己的槽函数去处理。
3)信号交互演示如下:小窗口获取大窗口的数据,都是通过信号传递的方式,让大窗口协助完成的想要操作。(GIF动画,如果不能播放,请点击打开图片)
QT += core gui CONFIG += c++11 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = 06_Signal TEMPLATE = app DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ main.cpp \ bigwidget.cpp \ silwiget.cpp HEADERS += \ bigwidget.h \ silwiget.h
b1)bigwidget.h
#ifndef BIGWIDGET_H #define BIGWIDGET_H #include <QWidget> #include"silwiget.h" class BigWidget : public QWidget { Q_OBJECT public: BigWidget(QWidget *parent = 0); ~BigWidget(); private: SilWiget silw; //定义小窗口为大窗口的成员变量 public: QPushButton retVal; QPushButton showSil; //"显示小窗口,隐藏大窗口" int tempVal; //大窗口的数据 //槽函数 void getSilval(); //槽函数,读取小窗口的数据 void getSilSig(int,QString); //响应小窗口的槽函数 void setSilSig(); //响应小窗口的槽函数,写入数据 void showSilWidget(); //显示小窗口,隐藏自己 void showBigWidget(); //显示大窗口,隐藏小窗口 }; #endif // BIGWIDGET_H
b2)bigwidget.cpp
#include "bigwidget.h" BigWidget::BigWidget(QWidget *parent) : QWidget(parent) { //窗口设置 this->setWindowTitle("我是大窗口"); this->resize(200,100); silw.show(); this->tempVal = 1234; //初始化变量 //按钮获取小窗口的成员的值 retVal.setText("获取小窗口数据"); retVal.setParent(this); //指定父对象 retVal.move(10,10); //设置位置 connect(&retVal,&QPushButton::pressed,this,&BigWidget::getSilval); //获取小窗口的函数。 //槽函数,响应小窗口的信号 //大窗口接收小窗口的信号 //connect(&silw,&SilWiget::testSignal02,this,&BigWidget::getSilSig); //获取小窗口的信号 connect(&silw,&SilWiget::testSignal01,this,&BigWidget::setSilSig); //小窗户获取大窗口的值 //显示小窗口 showSil.setText("显示小窗口,隐藏大窗口"); showSil.setParent(this); showSil.move(10,40); connect(&showSil,&QPushButton::pressed,this,&BigWidget::showSilWidget); //接收小窗口的显示大窗口隐藏小窗口的信号 connect(&silw,&SilWiget::showBigW,this,&BigWidget::showBigWidget); //使用指针的方式获取数据 connect(&silw,&SilWiget::testSignal03, [=](int *a) { cout <<"大窗口响应"; *a = 66666; } ); } void BigWidget::getSilval() //实现槽函数,打印小窗口的数据 { cout<<silw.tempdata; } void BigWidget::getSilSig(int a,QString str) //实现响应小窗口的槽函数 { cout<<str<<" a="<<a; } void BigWidget::setSilSig() //实现响应小窗口的信号,把大窗口的数据写入小窗口的成员 { cout<<"大窗口收到,数据已经写入!"; silw.tempVal = this->tempVal; } void BigWidget::showSilWidget() //显示小窗口,隐藏自己 { this->hide(); silw.show(); } void BigWidget::showBigWidget() //显示大窗口,隐藏小窗口 { this->silw.hide(); this->show(); } BigWidget::~BigWidget() { }
#ifndef SILWIGET_H #define SILWIGET_H #include <QWidget> #include<QString> #include <QPushButton> #include <QDebug> #define cout qDebug() class SilWiget : public QWidget { Q_OBJECT public: explicit SilWiget(QWidget *parent = nullptr); signals: //定义信号,信号是函数的声明,不用实现。 void testSignal01(); //无参信号 void testSignal02(int,QString); //有参信号 void showBigW(); //发出信号,“显示大窗口,隐藏小窗口" void testSignal03(int *); public: int tempdata; //小窗口的数据变量 int tempVal; //保存接收大窗口的数据 QString str; private: QPushButton getVal; //小窗口的按钮,发送获取数据信号 QPushButton getBigVal; //小窗口的按钮,输出获取到的数据 QPushButton showBig; //"显示大窗口,隐藏小窗口" QPushButton gettemp; //获取大窗口的数据 public: //槽函数 void emitSignal(); void outBigVal(); //输出获取到的内容 void emitShowBig(); //发送"显示大窗口,隐藏小窗口" void seedp(); }; #endif // SILWIGET_H
c2)silwiget.cpp
#include "silwiget.h" SilWiget::SilWiget(QWidget *parent) : QWidget(parent) { //窗口初始设置 this->setWindowTitle("我是小窗口"); this->resize(200,200); this->move(800,500); this->tempdata = 100; //初始化成员变量 this->tempVal = 0; //向大窗口发送信号 getVal.setText("获取大窗口的数据"); //发送信号 getVal.setParent(this); //指定父对象 getVal.move(10,10); connect(&getVal,&QPushButton::pressed,this,&SilWiget::emitSignal); //按下按钮产生的信号,有当前窗口处理,执行发送槽函数 //打印自己的成员变量的值 getBigVal.setText("打印获取到的结果"); getBigVal.setParent(this); getBigVal.move(10,40); connect(&getBigVal,&QPushButton::pressed,this,&SilWiget::outBigVal); //输出获取的内容 //显示大窗口 showBig.setText("显示,大窗口,隐藏小窗口"); showBig.setParent(this); showBig.move(10,100); connect(&showBig,&QPushButton::pressed,this,&SilWiget::emitShowBig); //指针方式获取大窗口的数据 gettemp.setText("获取大窗口的数据(指针方式)"); //发 送信号 gettemp.setParent(this); //指定父对象 gettemp.move(10,70); connect(&gettemp,&QPushButton::pressed,this,&SilWiget::seedp); //按下按钮产生的信号,有当前窗口处理,执行发送槽函数 } void SilWiget::emitSignal() //发送信号的槽函数 { qDebug()<<"小窗口正在呼叫大窗口:"; emit testSignal01(); //要求大窗口把他的数据写入小窗口的成员变量 //emit testSignal02(555,"我是小窗口"); } void SilWiget::outBigVal() //显示获取大窗口的数据 { qDebug()<<"tempVal = "<<tempVal; } void SilWiget::emitShowBig() //发送显示大窗口的信号 { emit showBigW(); } void SilWiget::seedp() //发送信号的槽函数 { emit testSignal03(&tempVal);//获取大窗口的数据 }
d)main.cpp
#include "bigwidget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); BigWidget w; w.show(); return a.exec(); }
6)完整的代码(注意解压后不能有中文路径) 3_2_1_Qt自定义的信号和槽2.zip
评论