QT 主窗口和子窗口相互切换示例

文件列表:

SubWidget.h

#ifndef SUBWIDGET_H
#define SUBWIDGET_H #include <QtWidgets/QWidget>
#include <QtWidgets/QPushButton> class SubWidget : public QWidget
{
Q_OBJECT public:
explicit SubWidget(QWidget *parent = );
~SubWidget(); void sendSlot(); signals:
/**
* 信号必须要signals关键字来声明
* 信号没有返回值, 但可以有参数
* 信号就是函数的声明, 无需定义
* 使用: emit mySignal();
* 信号可以被重载
*/
void mySignal();
void mySignalParm(int, QString); public slots: private:
QPushButton * bt;
}; #endif // SUBWIDGET_H

SubWidget.cpp

#include "SubWidget.h"

SubWidget::SubWidget(QWidget *parent)
: QWidget(parent)
{
this->setParent(parent);
this->setWindowTitle(QString::fromLocal8Bit("小弟"));
this->resize(QSize(, )); bt = new QPushButton(this);
bt->setText(QString::fromLocal8Bit("切换到主窗口"));
bt->move(QPoint(, )); connect(bt, &QPushButton::clicked, this, &SubWidget::sendSlot);
} SubWidget::~SubWidget()
{
} void SubWidget::sendSlot()
{
emit mySignal();
emit mySignalParm(, QString::fromLocal8Bit("已经切换到主窗口"));
}

mainwidget.h

#ifndef MAINWIDGET_H
#define MAINWIDGET_H #include <QtWidgets/QWidget>
#include <QtWidgets/QPushButton>
#include <QtCore/QDebug> #include "ui_mainwidget.h" #include "SubWidget.h" class MainWidget : public QWidget
{
Q_OBJECT public:
explicit MainWidget(QWidget *parent = );
~MainWidget(); signals: public slots:
void myButtonReleasedSlot();
void myChangeWin();
void myDealSub();
void myDealSubParm(int, QString); private:
Ui::MainWidgetClass ui; QPushButton * bt1;
QPushButton * bt2;
QPushButton * bt3; SubWidget * sw;
}; #endif // MAINWIDGET_H

mainwidget.cpp

#include "mainwidget.h"

MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this); this->setParent(parent);
this->setWindowTitle(QString::fromLocal8Bit("老大"));
this->resize(QSize(, )); bt1 = new QPushButton(this);
bt1->setText(QString::fromLocal8Bit("关闭窗口"));
bt1->move(QPoint(, )); /**
* bt1: 信号发出者, 指针类型
* &QPushButton::pressed: 信号的发射 &发送者的类名::信号名字
* this: 信号接受者, 指针类型
* &MainWidget::close: 信号的处理 &接收的类名::槽名字
*
*/
connect(bt1, &QPushButton::pressed, this, &MainWidget::close); bt2 = new QPushButton(this);
bt2->setText(QString::fromLocal8Bit("隐藏关闭窗口按钮以及改变自身文本内容"));
bt2->move(QPoint(, )); /**
* Qt5: 槽和普通的C++成员函数几乎是一样的
* 可以是虚函数,可以被重载,可以是public slots、protected slots、private slots,可以被其他C++成员函数直接调用
* 唯一不同的是:槽还可以和信号连接在一起,在这种情况下,信号被发射时,会自动调用这个槽
* 槽不需要信号传过来的参数时,可以不要参数;但槽函数一旦要参数,其参数个数,类型,顺序必须要和对应的信号保持一致。另外,槽函数的参数不能有缺省值。
* 由于信号的返回值为void, 槽必须和信号的返回值保持一致, 因此槽的返回值为void
*
*/
connect(bt2, &QPushButton::released, this, &MainWidget::myButtonReleasedSlot);
connect(bt2, &QPushButton::released, bt1, &QPushButton::hide); bt3 = new QPushButton(this);
bt3->setText(QString::fromLocal8Bit("切换到子窗口"));
bt3->move(QPoint(, )); sw = new SubWidget();
connect(bt3, &QPushButton::released, this, &MainWidget::myChangeWin); void (SubWidget::*funSignal)() = &SubWidget::mySignal;
void (SubWidget::*funSignalParm)(int, QString) = &SubWidget::mySignalParm;
void (MainWidget::*funSlot)() = &MainWidget::myDealSub;
void (MainWidget::*funSlotParm)(int, QString) = &MainWidget::myDealSubParm;
connect(sw, funSignal, this, funSlot);
connect(sw, funSignalParm, this, funSlotParm); /**
* Lambda 表达式, 匿名函数对象
* C++11 新增加的特性, 编译时需要添加参数C++11
* Qt配合信号一起使用, 非常方便
*/
QPushButton *bt4 = new QPushButton(this);
bt4->setText(QString::fromLocal8Bit("Lambda表达式并统计次数"));
bt4->move(QPoint(, ));
int cout = ;
connect(bt4, &QPushButton::clicked, this,
// = : 把外部所有局部变量、类中所有成员以值传递方式
// this : 类中所有成员以值传递方式
// & : 把外部所有局部变量, 引用符号
[=](bool isCheck) mutable {
cout++;
bt4->setText(QString::fromLocal8Bit("点击次数: ") + QString::number(cout));
qDebug() << QString::fromLocal8Bit("这是一个Lambda表达式测试输出").toStdString().c_str();
qDebug() << QString::fromLocal8Bit("打印参数: ").toStdString().c_str() << isCheck;
});
} MainWidget::~MainWidget()
{
// 直接或间接继承于QObject的对象, 在释放的内存的时候, 会自动调用析构函数, 释放子对象的内存
// 故QPushButton bt1 bt2 bt3 bt4 会随着QWidget MainWidget的释放而自动调用子对象的析构函数, 释放子对象的内存
} void MainWidget::myButtonReleasedSlot()
{
if (bt2 != nullptr)
{
bt2->setText(QString::fromLocal8Bit("发送信号, 槽处理完成 ..."));
}
} void MainWidget::myChangeWin()
{
this->hide();
sw->show();
} void MainWidget::myDealSub()
{
this->show();
sw->hide();
} void MainWidget::myDealSubParm(int num, QString str)
{
qDebug() << "num: " << num << " str: " << str.toUtf8().data();
qDebug() << "num: " << num << " str: " << str.toStdString().c_str(); qWarning() << "num: " << num << " str: " << str.toUtf8().data();
qInfo() << "num: " << num << " str: " << str.toUtf8().data();
//qFatal(str.toUtf8().data());
}

main.cpp

#include "mainwidget.h"
#include <QtWidgets/QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWidget w; // 执行MainWidget的构造函数
w.show();
return a.exec();
}

效果现象:

QT 主窗口和子窗口相互切换示例的更多相关文章

  1. HTML中IFrame父窗口与子窗口相互操作

    一.Iframe篇 //&&&&&&&&&&&&&&&&&&am ...

  2. windows 编程 —— 子窗口 与 子窗口控件

    目录: 子窗口与主窗口的交互 子窗口控件 按钮类别 button 滚动条类别 scrollbar 静态类别  static 编辑框类别 edit 清单方块 listbox 子窗口与主窗口的交互 创建窗 ...

  3. windows窗口分析,父窗口,子窗口,所有者窗口

    (本文尝试通过一些简单的实验,来分析Windows的窗口机制,并对微软的设计理由进行一定的猜测,需要读者具备C++.Windows编程及MFC经验,还得有一定动手能力.文中可能出现一些术语不统一的现象 ...

  4. PyQt5窗口关闭问题---关闭主程序的窗口但子窗口仍显示的问题

    使用PyQt5做界面开发时,如果做一个较复杂的程序时往往会涉及到在主程序中打开某个菜单弹出子窗口的问题,如果在打开很多子窗口的时候想一键退出关闭主窗口,但其它的子窗口仍然正常显示着,那么如何在代码中进 ...

  5. JavaScript(Iframe、window.open、window.showModalDialog)父窗口与子窗口之间的操作

    一.Iframe 篇 公共部分 //父对象得到子窗口的值 //ObjectID是窗口标识,ContentID是元素ID function GetValue(ObjectID,ContentID) { ...

  6. js window.open() 父窗口与子窗口的互相调用(未必有用)

    javascript 父窗口与子窗口的互相调用 <html> <head></head> <body> 主要实现父子关系的页面 window.opene ...

  7. 总结JavaScript(Iframe、window.open、window.showModalDialog)父窗口与子窗口之间的操作

    一.Iframe 篇 //&&&&&&&&&&&&&&&&&&a ...

  8. #js window.open() 父窗口与子窗口的互相调用【转】

    未完整版 javascript 父窗口与子窗口的互相调用 a.html 父页面 <HTML> <HEAD> <meta http-equiv="content- ...

  9. iframe父窗口和子窗口之间的调用

    1>父窗口获取子窗口 js方法 document.getElementById('if1').contentWindow.document: window.frames["if1&qu ...

随机推荐

  1. pandaboard es 制作SD启动卡OMAP4460

    1. 本次使用的是chipsee的板子,带屏幕的,先把资料传到Ubuntu的共享目录下 2. 进入共享目录 /mnt/hgfs/ubuntu_share/pandboard_es_linux# 3. ...

  2. 关于网易云验证码V1.0版本的服务介绍

    服务介绍 易盾验证码是一个用于区分人和机器的通用验证码组件.传统的字符型验证码由于存在破解率高,用户体验不友好等问题,已不适用于现今的互联网环境.易盾验证码抛弃了传统字符型验证码展示-填写字符-比对答 ...

  3. Tp框架之命名空间

    命名空间,相当于虚拟目录 实现自动加载类的机制 初始命名空间:Library文件夹 初始命名空间下面有很多根命名空间: 1.Library里面的文件夹 2.APP的模块文件夹 在tp框架中,只有这两个 ...

  4. cocos2dx2.0 帧动画的创建和播放过程 深入分析

    一.帧动画的创建过程帧动画的实现有四个不可或缺的类,如下:1.CCSpriteFrame:精灵帧信息.存储帧动画的每一帧的纹理基本信息. class CC_DLL CCSpriteFrame : pu ...

  5. tomcat配置https | 自签发证书配置

    未配置证书的访问:

  6. [寒假学习笔记](一)Markdown语法学习

    Markdown 学习 在博客园上使用markdown编辑,记录学习进度,以来日可以复习 前期准备 1. 安装markdownpad2 官网直接找下载安装,遇到bug他会自动提示信息,跟着提示去安装一 ...

  7. 关于cisco路由器配置的一些参数

    单臂路由设置 Switch(config-if)#no switchport Switch(config)#ip routingSwitch(config)#interface FastEtherne ...

  8. 2.hive里的增删改查

    1.hive的增删改查 查询数据库 hive> show databases; OK default Time taken: 0.254 seconds, Fetched: 1 row(s) h ...

  9. ECharts模块化使用5分钟上手

    什么是EChats? 一句话: 一个数据可视化(图表)Javascript框架,详细?移步这里,类似(推荐)的有 HighCharts,其他? 嗯,先看看吧-- 快速上手: 模块化单文件引入(推荐). ...

  10. PHPDoc 学习记录

    https://zh.wikipedia.org/wiki/PHPDoc PHPDoc 是一个 PHP 版的 Javadoc.它是一种注释 PHP 代码的正式标准.它支持通过类似 phpDocumen ...