目的:通过主窗口与子窗口之间切换来 学习信号与槽的应用
平台:win10 QtCreater5.7
效果:
实现过程:
一、工程建立
1、基于widget基类建立工程
2、添加子窗口类
二、代码实现
1、在主窗口类定义相关类对象、槽和信号
// 声明button对象
QPushButton *pBtn1;
QPushButton *pBtn2;
QPushButton *pBtn3;
subwidget subWindows;
void ChanbeBtnText(bool );
void SoltHideMe();
void SlotsShowMe();
2、在主窗口类的构造函数添加主窗口上的相关控件、设置信号和槽:
// 设置窗体标题和固定大小
this->setWindowTitle("主窗体----第一个QT程序");
this->resize(800,600);
this->setFixedSize(800,600);
// 在窗体上放置两个button
pBtn1 = new QPushButton("第一个Button",this);
pBtn1->move(10,10);
pBtn2 = new QPushButton;
pBtn2->setParent(this);
pBtn2->setText("第二个Button");
pBtn2->move(10,50);
pBtn3 = new QPushButton("显示子窗口",this);
pBtn3->move(10,120);
// 创建关闭窗体信号和槽(信号和槽都是函数)
// 信号:只声明,不需要定义
// 槽:既要声明,也要定义,回调函数
// connect(pBtn1,pBtn1->clicked,this,&mainwidget::close);
//connect(pBtn1,&QPushButton::clicked,this,&mainwidget::close);
/*
* 自定义槽函数:
* 1、槽函数在QT5中 可以说是任意类的成员函数、全局函数,静态函数,lambda表达式(隐式函数)
* 2、槽函数要和信号对应(返回值,参数)
* 3、信号没有返回值,槽函数返回值值 void
* 4、void msignal(int ,double,QString);
* void myslot(int ,double);
* 5、槽函数的参数是为了接收信号传过来的数据
* 6、槽函数的参数应该不能够大于信号的参数个数,可以小于信号的参数个数
* 7、槽函数可以重载
*/
//目的 :改变btn2的文本内容
connect(pBtn1,&QPushButton::clicked,this,&mainwidget::ChanbeBtnText);
connect(pBtn3,&QPushButton::clicked,this,&mainwidget::SoltHideMe);
//connect(this,&QPushButton::clicked,)
connect(&subWindows,&subwidget::SinnalSub,this,&mainwidget::SlotsShowMe);
3、在子窗口类的头文件定义相关自定义信号和槽及相关对象
signals:
//自定义信号,必须使用signal声明
void SinnalSub();
/*
* 1、可以有参数
* 2、可以重载
* 3、返回值:void
* 4、发送信号:emit + 信号名
* emit sigsub();
*/
public slots:
void SlotsSubW();
private:
QPushButton *pBtn3;
4、在子窗口类的构造函数实现控件添加,信号和槽设置。
this->resize(400,300);
this->setWindowTitle("子窗口");
//this->windowTitle("子窗口") ;
pBtn3 = new QPushButton("显示主窗口",this);
pBtn3->resize(100,40);
pBtn3->move(80,80);
connect(pBtn3,QPushButton::clicked,this,&subwidget::SlotsSubW);