学习中遇到不明白的按F1查帮助文档!
1.根据基类QWidget派生出两个类,MainWidget和SubWidget
2.这里需要强调的一点的只有如何从子窗口切换到主窗口:因为为了把主窗口切换到子窗口,我们把SubWidget的对象作为MainWidget的数据成员,但是该如何实现从子窗口切换到主窗口呢?
这里用到了关键字signals(这是Qt的功能,不是C++的)
SubWidget的定义如下:
#ifndef SUBWIDGET_H
#define SUBWIDGET_H
#include <QWidget>
#include <QPushButton>
class SubWidget : public QWidget
{
Q_OBJECT
public:
explicit SubWidget(QWidget *parent = nullptr);
void sendSlot();
signals:
/* 信号必须有signals关键字来声明
* 信号没有返回值,但可以有参数
* 信号就是函数的声明,只需声明,无需定义
* 使用: emit mySignal();
*/
void mySignal();
private:
QPushButton b;
};
#endif // SUBWIDGET_H
再看SubWidget成员函数的实现:
#include "subwidget.h"
SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
b.setParent(this);
b.setText("切换到主窗口");
b.move(100,100);
this->setWindowTitle("子窗口");
this->resize(400,300);
connect(&b,&QPushButton::pressed,this,&SubWidget::sendSlot);
}
void SubWidget::sendSlot()
{
emit mySignal();//发送广播
}
在SubWidget的成员函数中自定义了一个槽函数,用来emit mySignal();
,接着主窗口就会收到并处理子窗口的信号(MainWidget 中自定义槽函数实现)。
MainWidget 的定义以及成员函数的实现如下:
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QWidget>
#include<QPushButton>
#include "subwidget.h"//子窗口头文件
class MainWidget : public QWidget
{
Q_OBJECT
public:
MainWidget(QWidget *parent = nullptr);//带默认参数的构造函数
void myslot();
void changeWin();//切换到子窗口,并隐藏主窗口
void dealSub();//处理子窗口发来的信号
~MainWidget();
private:
QPushButton b1;
QPushButton *b2;
QPushButton b3;
SubWidget w;//子窗口类的对象作为主窗口类的数据成员
};
#endif // MAINWIDGET_H
#include "mainwidget.h"
#include<QPushButton>
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)//基类QWidget,派生类MainWidget
{
b1.setParent(this);
b1.setText("关闭窗口");
b1.move(100,100);
b2=new QPushButton(this);//使用QPushButton的构造函数指定父对象
b2->setText("abc");
this->setWindowTitle("主窗口");
this->resize(400,300);
b3.setParent(this);
b3.setText("切换到子窗口");
b3.move(50,50);
//把光标放到要查看的类名上(这里是QPushButton),按两次F1,去它的基类中找信号函数signal或槽函数slot
connect(&b1,&QPushButton::pressed,this,&MainWidget::close);
/* &b1:信号发出者,指针类型
* &QPushButton::pressed:处理的信号 &发送者的类名::信号名字
* this:信号接收者
* &MainWidget::close:槽函数,信号处理函数 &接收的类名::槽函数名字
*/
//接下来自定义一个槽
/* 自定义槽,普通函数的用法
* 可以是任意的成员函数,普通全局函数,静态函数
* 槽函数需要和信号一致(参数一致,返回值一致)
* 由于信号都是没有返回值的,所以,槽函数一定也是void
*/
connect(b2,&QPushButton::released,this,&MainWidget::myslot);
connect(b2,&QPushButton::released,&b1,&QPushButton::hide);
//接下来进行窗口切换任务
connect(&b3,&QPushButton::released,this,&MainWidget::changeWin);
//处理子窗口的信号
connect(&w,&SubWidget::mySignal,this,&MainWidget::dealSub);
}
void MainWidget::changeWin()
{
w.show();//子窗口显示
this->hide();//本窗口隐藏
}
void MainWidget::dealSub()
{
this->show();//本窗口显示
w.hide();//子窗口隐藏
}
void MainWidget::myslot()
{
b2->setText("123");
}
MainWidget::~MainWidget()
{
}
主函数如下:
#include "mainwidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWidget w;//执行MainWidget的构造函数,在MainWidget的构造函数中构造子对象
w.show();
return a.exec();
}