说明
如果窗口内按钮有很多,不可能全部写在主函数中,会让主函数过于长,这些功能全部在窗口的构造函数内实现,这里就需要用到信号和槽。
创建按钮
1.在头文件中定义两个按钮
一个普通的,一个指针的
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QWidget>
#include <QPushButton>
class MainWidget : public QWidget
{
Q_OBJECT
public:
MainWidget(QWidget *parent = nullptr);
~MainWidget();
private:
QPushButton b1;
QPushButton *b2;
};
#endif // MAINWIDGET_H
2.在cpp中实现
注意指针的要new
#include "mainwidget.h"
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
b1.setText("开始");
b1.setParent(this);
b1.move(100,100);
b2 = new QPushButton(this);
b2->setText("结束");
b2->move(200,100);
}
MainWidget::~MainWidget()
{
}
书写信号
选中QPushButton进入到帮助文档
进入到基类,在Contets中有个Signals(信号),点进去里面有按钮的一些信号的函数
这里我选择按下
书写方式:
/*
* b2:信号发出者,指针类型;
* &QPushButton::pressed:处理信号,&发送者的类名::信号名字;
* this:信号接受者,谁感兴趣谁接收;
* &MainWidget::close:槽函数,信号处理函数,&接收的类名::槽函数名字
*/
//关闭窗口
connect(b2,&QPushButton::pressed,this,&MainWidget::close);
自定义槽
说明
普通函数的用法;
Qt5:任意的成员函数,普通全局函数,静态函数;
槽函数需要和信号一致(参数,返回值);
由于信号都是没有返回值的,所以槽函数一定没有返回值;
想实现的效果:
点击按钮,使其改变本身的按钮的名字;
1)头文件中定义自己的函数
//自定义槽
void mySlot();
2)cpp中实现
void MainWidget::mySlot()
{
b1.setText("123");
}
3)构造函数书写
// 抬起b1按钮的时候改变b1按钮的Text内容
connect(&b1,&QPushButton::released,this,&MainWidget::mySlot);
同样的信号不同的槽
信号和槽的关系:
信号——短信;
槽——接收短信的手机;
//抬起b1按钮,将b2隐藏
connect(&b1,&QPushButton::released,b2,&QPushButton::hide);
两个窗口相互切换
窗口切换时会收缩窗口的大小,可以用resize(宽,高)固定大小。
1.创建一个新窗口类
2.Base class选择QWidget
3.在新建的类头文件中定义一个按钮用于切换回主界面
4.在cpp中设置窗口标题以及按钮的属性
5.在主窗口类中包含副窗口的头文件
6.在头文件中定义副窗口的对象
7.
副窗口.h
#ifndef SETWIDGET_H
#define SETWIDGET_H
#include <QWidget>
#include <QPushButton>
class SetWidget : public QWidget
{
Q_OBJECT
public:
explicit SetWidget(QWidget *parent = nullptr);
void sendSlot();
signals:
/*信号必须有这个关键字来声明
* 信号没有返回值,但可以有参数
* 信号就是函数的声明,只需声明,无需定义
* 使用:emit mySignal();
*/
void mySignal();
private:
QPushButton b4;
};
#endif // SETWIDGET_H
副窗口.cpp
#include "setwidget.h"
SetWidget::SetWidget(QWidget *parent) : QWidget(parent)
{
setWindowTitle("设置栏");
//设置窗口大小
resize(400,400);
b4.setText("返回");
b4.setParent(this);
b4.move(100,100);
connect(&b4,&QPushButton::clicked,this,&SetWidget::sendSlot);
}
void SetWidget::sendSlot()
{
emit mySignal();
}
头文件中要有signals:关键字,在关键字中定义一个信号用于发射给主窗口(不用实现)。再定义一个函数用于将此信号发射出去,要发射的信号名前面加上emit。
8.主窗口定义一个槽函数,用来接收副窗口发射过来的信号并在函数中实现想要的效果。
9.主窗口类中开始连通
main中:
//显示子窗口
connect(&b3,&QPushButton::released,this,&MainWidget::changeWin);
//处理子窗口信号
connect(&S,&SetWidget::mySignal,this,&MainWidget::dealSet);
成员函数的实现:
void MainWidget::changeWin()
{
//子窗口显示
S.show();
//本窗口隐藏;
this->hide();
}
void MainWidget::dealSet()
{
//子窗口显示
S.hide();
//本窗口隐藏;
show();
}
总结
其他子窗口的connect的作用就是将各自窗口创建的信号(Signals)发射出去,由主窗口接收到以后书写各自的作用。