900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Qt实现主窗口和子窗口的切换

Qt实现主窗口和子窗口的切换

时间:2020-10-29 10:35:24

相关推荐

Qt实现主窗口和子窗口的切换

学习中遇到不明白的按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_OBJECTpublic: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_OBJECTpublic: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或槽函数slotconnect(&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();}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。