QT作业1:实现两个窗口的切换
创始人
2025-05-30 16:13:39

两个窗口切换

  • 1 需求
  • 2 分析
  • 3 第一种方法
  • 4 第二种方法

1 需求

在这里插入图片描述
设计两个窗口,每个窗口中都包含一个按钮,最开始的时候只显示窗口1,当按下窗口1中的按钮时,窗口1隐藏(hide),同时窗口2显示(show),当按下窗口2中的按钮时,窗口2隐藏,窗口1显示。

2 分析

这个案例最关键的是,如何让两个窗口建立连接(connect),最开始学QT的时候,我们都是在Widget的构造函数中调用connect函数,但这里不能直接这样做,因为创建的时候,你拿不到另一个Widget对象,如果通过构造函数的参数传进来,则传进来的那个Widget该如何构建?解决这个问题可以使用两种方法:
1 重载构造函数,例如w1通过无参构造函数创建,w2通过有参,w2在创建的时候将w1传进去,然后在有参构造函数中建立联系(connect)
2 新建一个类A,这个类A必须直接或间接继承QObject,这样才能获得connect函数(因为connect是QObject的成员函数),然后将w1和w2都作为A的成员变量,并在A的构造函数中实现两个窗口的连接

需要注意的一点是,信号的发送者是QPushButton指针,而不是窗口对象,并且,为了建立两个窗口的联系,最好将QPushButton指针作为Widget类的成员变量,这样通过窗口就能拿到信号发送者,详见下面的代码。

3 第一种方法

widget.h内容如下:

#ifndef WIDGET_H
#define WIDGET_H#include 
#include "QPushButton"class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();Widget(const Widget& w2, QWidget *parent = nullptr);public:QPushButton * btn;
};
#endif // WIDGET_H

widget.cpp内容如下,为什么用lambda表达式不行,我想了很久都不知道,最后没有使用lambda表达式,不过后面我找到原因了,就是const,具体问题可以看注释:

#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent)
{btn = new QPushButton("button", this);btn->move(300, 300);
}Widget::~Widget()
{
}Widget::Widget(const Widget& another_w, QWidget *parent) : QWidget(parent)
{this->btn = new QPushButton("button", this);this->btn->move(300, 300);/* //下面的代码为何会报错?connect(this->btn, &QPushButton::clicked, [=](){this->hide();another_w.show();});//another_w在lambda函数中是常对象,不能调用非常成员函数,this是常指针,因此可以调用hide//1 能不能添加mutable选项(即[=]()mutable),让another_w可以在函数内部调用show?//		不能,因为another_w是通过构造函数传入,它已经被声明为了const,这里用mutable会冲突//2 能不能在调用connect之前,对another_w先进行取址操作,然后在lambda函数内部通过指针调用show,像this一样?//		不能,因为another_w在传入时就已经被声明为了const,无法进行取址操作,除非修改函数声明和定义,去掉const*/connect(this->btn, &QPushButton::clicked, this, &QPushButton::hide);connect(this->btn, &QPushButton::clicked, &another_w, &QPushButton::show);connect(another_w.btn, &QPushButton::clicked, &another_w, &QPushButton::hide);connect(another_w.btn, &QPushButton::clicked, this, &QWidget::show);
}

main.cpp内容如下:

#include "widget.h"#include int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w1;Widget w2(w1);w1.setGeometry(100, 100, 600, 600);w1.setWindowTitle("窗口1");w2.setGeometry(1000, 100, 600, 600);w2.setWindowTitle("窗口2");w1.show();return a.exec();
}

4 第二种方法

widget.h内容:

#ifndef WIDGET_H
#define WIDGET_H#include 
#include "QPushButton"class widget : public QWidget
{Q_OBJECT
public:explicit widget(QWidget *parent = nullptr);public:QPushButton* btn;
signals:};#endif // WIDGET_H

widget.cpp内容

#include "widget.h"widget::widget(QWidget *parent) : QWidget(parent)
{btn = new QPushButton("button", this);btn->move(300, 300);
}

mainwindow.h 内容如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include 
#include "widget.h"
class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();public:widget w1, w2;
};
#endif // MAINWINDOW_H

mainwindow.cpp内容如下:

#include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{connect(w1.btn, &QPushButton::clicked, [=](){  //如果写成 [w1, w2]企图捕获类的成员变量w1和w2,会报错//mainwindow.cpp:6:45: error: 'w2' in capture list does not name a variablethis->w1.hide();this->w2.show();});connect(w2.btn, &QPushButton::clicked, [this](){    //将this指针写到捕获参数列表时,函数内部可以直接使用成员函数和成员变量w2.hide();                                      //使用w2和w1,无需通过this指针w1.show();});w1.setGeometry(100, 100, 600, 600);w1.setWindowTitle("窗口1");w2.setGeometry(1000, 100, 600, 600);w2.setWindowTitle("窗口2");
}MainWindow::~MainWindow()
{
}

main.cpp内容如下:

#include "mainwindow.h"#include int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow mw;mw.w1.show();return a.exec();
}

相关内容

热门资讯

App 性能测试关注点 一、 App 性能指标 App 性能问题如 app 使用时卡顿严重或者加载页面慢,c...
Python 中错误 Synt... 文章目录重写错误发生的行导致错误的字符可能是不可见的另一个错误发生的例子确保我们的键盘设置为正确的语...
妖魔化车企高负债,是杞人忧天的... 撰文丨鹿羽近期,车企负债问题引起广泛热议。比亚迪集团品牌及公关处总经理李云飞发文回应,其从资产负债率...
曼联5000万镑豪购奇招!神秘... 曼联5000万镑豪购奇招!神秘前队友密谋,姆贝乌莫驾临梦剧场? 老特拉福德的夏窗还没正式开启,空气中...
【Leetcode】队列实现栈...      目录 一.【Leetcode225】队列实现栈 1.链接 2.题目再现  3.解法 二.【...
Kaggle实战入门:泰坦尼克... Kaggle实战入门:泰坦尼克号生还预测1. 加载数据2. 特征工程3. 模型训练4....
【Tomcat内核】serve... 以下回答来自chatGPT server是什么? Server可以翻译为服务器&#x...
广州美妆新势力,正在横扫东南亚... 记者丨赖镇桃 编辑丨和佳 陈晓平Henry在美妆品牌Colorkey国际部工作,他第一次到越南,是去...
【国产FPGA】国产FPGA搭... 最近收到了高云寄过来的FPGA板卡,下图:来源:https...
Linux下KingbaseE... 一、备份方式 KingbaseESV8数据库备份的两种方式: (1&#x...
Fastapi学习笔记之使用 ... 前言我写了一个关于 FastAPI 的简单教程,它是关于简化和理解 API 的工作原理...
法网|冲击八强!女单第四轮,郑... 齐鲁晚报·齐鲁壹点 怀晓 郑钦文将向八强席位发起冲击。新华社发 连下3场击败帕芙柳琴科娃、阿朗戈和...
“工作三年,跳槽要求涨薪50%... 如果问在TI行业涨工资最快的方式是什么?回答最多的一定是:跳槽ÿ...
业绩承压,中信重工募投项目延期... 5月30日晚间,中信重工(601608)发布公告称,公司召开第六届董事会第十三次会议,审议通过了《关...
财联社创投通:一级市场本周90... 《科创板日报》5月31日讯据财联社创投通数据显示,本周(5.24-5.30)国内统计口径内共发生90...
【投融资动态】汉硅半导体A+轮... 证券之星消息,根据天眼查APP于5月27日公布的信息整理,辽宁汉硅半导体材料有限公司A+轮融资,融资...
Linux 线程同步 文章目录一、线程同步介绍同步与互斥概述线程同步问题二、互斥锁为什么需要互斥锁互斥锁 Mutex 介绍...
可以谈一谈动态扩容缩容的分库分... 如何设计可以动态扩容缩容的分库分表方案? 面试官心理分析 对于分库分表来说,主要是面对以下问题: 选...
MySQL能干大部分事,为什么... 因为需要背锅侠?先来看一个真实案例。 某年某央企千万级用户百亿金额的上古系统ÿ...
利用两个队列(单链表模拟)实现... 利用队列实现栈数据结构225. 用队列实现栈 - 力扣(LeetCode)...
STM32之震动传感器、继电器... 目录 一、震动传感器介绍及实战 二、编程代码实现 1、gpio.c---------初始化GPIO口...
宝武钢铁集团迎来新任总会计师 ... 中国宝武钢铁集团有限公司(以下简称“宝武钢铁集团”)官网近日更新信息显示,李丽娜已于2025年5月起...
【java刷题】排序子序列 这里写目录标题问题描述解决思路实现代码 问题描述 牛牛定义排序子序列为一个数组中一段连续的子序列,并...
mysql-interview 隔离级别有哪几种,分别解决什么问题为什么mysql 默认隔离级别是rr,...
全球资金从美国回流新兴市场 全... 参考消息网5月31日报道 据《日本经济新闻》5月27日报道,全球资金开始再次流入新兴市场国家。从流入...
银河麒麟v10系统硬盘挂载并配... 一、查看磁盘 近期由于centos系统停止更新用户服务器要更换银河麒麟v10,拿到服务...
Leetcode刷题之经典双指...         光是话不行,要紧的是做。                       ...
京东美团外卖大战的底层逻辑是什... 原文标题:《京东美团外卖大战的深度分析》,题图来自:视觉中国 京东最近强势进军外卖行业与美团进行了激...