赞
踩
根据基类QWidget派生出两个类,MainWidget和SubWidget,分别对应主窗口和子窗口
主窗口切换到子窗口,我们把SubWidget的对象作为MainWidget的数据成员
主窗口MainWidget 的定义以及成员函数的实现如下:
#ifndef MAINWIDGET_H #define MAINWIDGET_H #include <QPushButton> #include <QWidget> #include "subwidget.h" //子窗口头文件 class MainWidget : public QWidget { Q_OBJECT public: MainWidget(QWidget *parent = nullptr); ~MainWidget(); void mySlot();//自定义一个槽函数 void subwinSlot(); void subwinSlot2(); private: QPushButton b1; QPushButton *b2; QPushButton b3; SubWidget sub_w; //创建一个子窗口对象,子窗口类的对象作为主窗口类的数据成员 }; #endif // MAINWIDGET_H
其中 SubWidget sub_w; //创建一个子窗口对象,子窗口类的对象作为主窗口类的数据成员
#include "mainwidget.h" #include <QPushButton> MainWidget::MainWidget(QWidget *parent) //构造函数 : QWidget(parent) { b1.setParent(this); b1.setText("close"); b1.move(100,100); b2=new QPushButton; //创建一个动态内存 b2->setText("按钮2"); b2->move(100,200); b2->setParent(this); connect(&b1,&QPushButton::pressed,this,&MainWidget::close); /* * &b1:信号发出者,指针类型 * &QPushButton::Press:处理的信号, &发送者的类名::信号的名字 * this:信号接收者 * &MainWidget::close: 槽函数,信号处理函数 &接收的类名::槽函数的名字 */ /* * 自定义槽函数,普通函数的用法 * Qt5:任意的成员函数,普通全局函数,静态函数 * 槽函数需要和信号一致(参数,返回值) * 由于信号都是没有返回值,所以槽函数也没有返回值 */ connect(b2,&QPushButton::released,this,&MainWidget::mySlot); //b2动态分配空间,本来就是指针 connect(b2,&QPushButton::pressed,&b1,&QPushButton::hide); this->setWindowTitle("主窗口"); b3.setParent(this); b3.setText("切换到子窗口"); b3.move(50,50); connect(&b3,&QPushButton::pressed,this,&MainWidget::subwinSlot); //处理子窗口的信号 connect(&sub_w,&SubWidget::mySignal,this,&MainWidget::subwinSlot2); //设置窗口大小 this->resize(800,600); } void MainWidget::mySlot()//成员函数的定义 { b2->setText("123"); } void MainWidget::subwinSlot() { //显示子窗口 this->hide(); sub_w.show(); } void MainWidget::subwinSlot2() { this->show(); sub_w.hide(); } MainWidget::~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); private: QPushButton b1; public: void mainwinSlot(); signals: /* * 信号必须有signals关键字来生命 * 信号没有返回值,但是可以有参数 * 信号就是函数的声明,只需声明,无需定义 * 使用:emit mySignal(); */ void mySignal(); }; #endif // SUBWIDGET_H
子窗口SubWidget类的成员函数的实现
#include "subwidget.h" SubWidget::SubWidget(QWidget *parent) : QWidget(parent) { this->setWindowTitle("子窗口"); b1.setParent(this); b1.setText("返回主窗口"); b1.move(100,100); connect(&b1,&QPushButton::released,this,&SubWidget::mainwinSlot); //使用自定义的槽函数 //设置窗口大小 this->resize(800,600); } void SubWidget::mainwinSlot() { emit mySignal();//自定义槽函数的功能为发出信号 }
//处理子窗口的信号
connect(&sub_w,&SubWidget::mySignal,this,&MainWidget::subwinSlot2);
void MainWidget::subwinSlot2()
{
this->show();
sub_w.hide();
}
主函数如下:
#include "mainwidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWidget w; //创建一个MainWidget对象先执行类的构造函数
w.show();
return a.exec();
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。