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. PHPStrom 里修改Emmet对php的自动扩展

    PHPStrom 7.1.3 Emmet 想必大家都比较清楚了.Emmet有个特点,对于匹配不到的符号,仍然会自动扩展为标签的形式,比如我输入aaaa,然后按tab,会自动扩展为<aaaa> ...

  2. springmvc 使用 response 的注意事项以及解决500 空指针异常找不到 response 的方法

    使用注解方式在类中(Controller)来装载request时,是可以正常使用request的(必须在启动时才注入,所以不支持热部署),但是同样使用这种方式在已经装载了 request的情况下装载  ...

  3. selenium自动化之稳定版本环境介绍

    大家都知道,目前selenium版本已经升级到3.0了,selenium3只是在selenium2的基础上做了一些调整,最明显的区别就是 selenium2对Firefox的支持最高只支持46及以下版 ...

  4. python程序设计——面向对象程序设计:继承

    继承是为代码复用和设计复用而设计的 在继承关系中,已有的.设计好的类称为父类或基类,新设计的类为子类或派生类 派生类可以继承父类的公有成员,但不能继承其私有成员 如果需要在派生类中调用基类的方法,可以 ...

  5. Oracle同义词和序列

    同义词:是表.索引.视图的模式对象的一个别名,通过模式对象创建同意词,可以隐藏对象的实际名称和 所有者信息,为对象提供一定的安全性,开发应用程序时:应该尽量避免直接使用表,视图 或其他对象,改用对象的 ...

  6. JavaScript学习笔记(一)——JS速览

    第一章 JS速览 1 限制时间处理事件 <script> setTomeout(wakeUpUser,5000); function wakeUpUser() { alert(" ...

  7. Jenkins之Sonar 代码检查

    一.简介 SonarQube 是一个用于代码质量管理的开放平台.通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具.与持续集成工具(例如 Hudson/Jenkins 等 ...

  8. hbase实战——(1.1 nosql介绍)

    什么是nosql NoSQL(NoSQL = Not Only SQL),意思是不仅仅是SQL的扩展,一般指的是非关系型的数据库. 随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0 ...

  9. python序列成员资格

    可以用做登录操作,判断用户名密码是否正确! 代码示例: database = [ ['], ['], ['], ['] ] username = input("UserName: " ...

  10. LeetCode 36. Valid Sudoku (C++)

    题目: Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according t ...