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. LVS入门篇(二)之LVS基础

    1. LVS介绍 LVS是Linux虚拟服务器(LinuxVirtualServers),使用负载均衡技术将多台服务器组成一个虚拟服务器.它为适应快速增长的网络访问需求提供了一个负载能力易于扩展,而价 ...

  2. 《Flutter实战》开源电子书

    <Flutter实战>开源电子书 <Flutter实战> 开源了,本书为 Flutter中文网开源电子书项目,本书系统介绍了Flutter技术的各个方面,本书属于原创书籍(并非 ...

  3. Java 注解 初探 (一)

    自JDK1.5之后,就开始出现注解.想要了解注解的来源和注解的用法,通过搜索引擎大都是针对某一个注解的解释,很难找到关于注解系列的文章,便自己看下. 基于Annotation的注释,说明Annotai ...

  4. MySQL数据库之数据类型和完整性约束

    补充: select * from mysql.user #显示出来乱了 select * from mysql.user\G #加了\G后一行一行显示了 一.数据类型:分不同种类去存不同类型的数据 ...

  5. Migrating to WebSphere 9

    Migrating to WebSphere 9 Make a migration plan Requirements Migrate WebSphere profiles into the new ...

  6. OpenWrt架设nginx php网站

    参考 http://www.vinoca.org/2012/05/31/openwrt%E6%9E%B6%E8%AE%BEnginxphp%E7%BD%91%E7%AB%99/ 一.安装相关包 opk ...

  7. 转发——谷歌云官方:一小时掌握深度学习和 TensorFlow

    转发——谷歌云官方:一小时掌握深度学习和 TensorFlow 本文转发自新智元,链接如下: http://mp.weixin.qq.com/s?__biz=MzI3MTA0MTk1MA==& ...

  8. ubuntu/linux系统中安装jdk以及eclipse(附图解详细步骤)

    1.首先得先下载JDK和eclipsejdk下载网址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-21 ...

  9. Python函数标注

    Python函数标注 是关于用户自定义函数中使用的类型的完全可选元数据信息. 函数标注 以Python字典的形式存放在函数的 __annotations__ 属性中,并且不会影响函数的任何其他部分. ...

  10. CentOS7部署ELK5.2

    原文发表于cu:2017-02-10 参考文档: Elasticsearchyum文档:https://www.elastic.co/guide/en/elasticsearch/reference/ ...