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. Nginx入门篇(七)之Nginx+keepalived高可用集群

    一.keepalived介绍 keepalived软件最开始是转为负载均衡软件LVS而设计,用来管理和监控LVS集群系统中各个服务节点的状态,后来又加入了可实现高可用的VRRP功能.所以Keepali ...

  2. ELKStack入门篇(三)之logstash收集日志写入redis

    1.部署Redis 1.1.下载redis [root@linux-node2 ~]# wget http://download.redis.io/releases/redis-4.0.6.tar.g ...

  3. [NOIp2018]货币系统 背包

    LG传送门 完全背包板子题 显然就是判断有多少种面值的货币可以被其他面值的货币表示,完全背包搞一搞就好了. 考场代码(一看这两格缩进就知道是考场代码): #include<cstdio> ...

  4. pandaboard es 制作SD启动卡OMAP4460

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

  5. 在docker中执行linux shell命令

    在docker中执行shell命令,需要在命令前增加sh -c,例如: docker run ubuntu sh -c 'cat /data/a.txt > b.txt' 否则,指令无法被正常解 ...

  6. google::protobuf 编译方法

    这两天用了一下Protobuf 感觉很方便, 记录一下编译过程, 以做务忘(需要安装cmake): 1: 下载地址: https://developers.google.com/protocol-bu ...

  7. Git生成多个ssh key

    在实际的工作中, 有可能需要连接多个远程仓库, 例如我想连接私有仓库.GitLab官网.GitHub官网, 那么同一台电脑就要生成多个ssh key: ssh-keygen -t rsa -C &qu ...

  8. Python接口测试实战4(下) - 框架完善:用例基类,用例标签,重新运行上次失败用例

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  9. 随身Wifi+win7 搭建http代理 域名劫持 抓包 内容篡改实验环境

    需求来源: 1.平板或手机是个封闭系统无法给wifi设置代理 2.需要利用filllder进行抓包,内容篡改等实验 拥有硬件资源:PC机器 + 小米随身wifi 方案1: NtBind Dns + N ...

  10. 所见即所得:七大无需编程的DIY开发工具

    现如今,各种DIY开发工具不断的出现,使得企业和个人在短短几分钟内就能完成应用的创建和发布,大大节省了在时间和资金上的投入.此外,DIY工具的出现,也帮助广大不具备专业知识和技术的“移动开发粉”创建自 ...