通俗易懂玩QT:QStackedWidget 学习

news2024/11/27 21:41:33

QStackedWidget 学习

一、介绍

业务需求,用到了 QStackWidget 这个类,然后程序存在很严重的内存泄露问题,所以特意研究了一下 QStackWidget 类,QStackWidget 类的功能是窗体切换,它比 QTabWidget 使用起来更为灵活,QStackWidget 类的窗体切换需要自己用 connect 来关联,同时也可以使用事件来触发。

二、使用

下面简单说一下 QStackWidget 类的一些用法(这里以两个 testwidget 类来做示范)

  1. 首先初始化窗体类与 QStackWidget 类
testwidget *tw_1 = new testwidget(1);
testwidget *tw_2 = new testwidget(2);

QStackedWidget *stack_widget = new QStackedWidget();
  1. 向 QStackWidget 类中添加窗体
stack_widget->addWidget(tw_1);
stack_widget->addWidget(tw_2);
  1. 切换到你想要最开始展现的窗体,默认为 0(即第一个被注册的窗体)
//选择以下任一方法使用即可,前者使用 index 来切换窗体,index 的值与你注册窗体时的先后顺序有关,注意不要越界使用,后者是通过窗体的名称切换窗体
stack_widget->setCurrentIndex(0);
stack_widget->setCurrentWidget(tw_1);
  1. 使用按钮的单击事件进行窗体切换
connect(pbtn_1, &QPushButton::clicked, [=]() {
    stack_widget->setCurrentIndex(0);
});

connect(pbtn_2, &QPushButton::clicked, [=]() {
    stack_widget->setCurrentIndex(1);
});

以上即为 QStackWidget 类的简单实用,不过值得注意的是,所有注册的窗体在切换过程中并不会得到释放,所以在窗体切换之后要及时关闭上一窗体的线程与定时器,否则内存可能突然大增,造成程序直接退出。

三、示例

这里以定时器为例,演示一下使用中的注意事项

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QVBoxLayout>
#include <QStackedWidget>
#include <QPushButton>
#include <QDebug>

#include "testwidget.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow) {
    ui->setupUi(this);

    static int times = 0;

    testwidget *tw_1 = new testwidget(1);
    testwidget *tw_2 = new testwidget(2);
    testwidget *tw_3 = new testwidget(3);
    testwidget *tw_4 = new testwidget(4);

    QPushButton *pbtn_1 = new QPushButton("TEST ONE");
    QPushButton *pbtn_2 = new QPushButton("TEST TWO");
    QPushButton *pbtn_3 = new QPushButton("TEST THREE");
    QPushButton *pbtn_4 = new QPushButton("TEST FOUR");

    QStackedWidget *stack_widget = new QStackedWidget();
    stack_widget->addWidget(tw_1);
    stack_widget->addWidget(tw_2);
    stack_widget->addWidget(tw_3);
    stack_widget->addWidget(tw_4);
//    stack_widget->setCurrentIndex(0);

    QHBoxLayout *h_layout = new QHBoxLayout();
    h_layout->setMargin(0);
    h_layout->addWidget(pbtn_1);
    h_layout->addWidget(pbtn_2);
    h_layout->addWidget(pbtn_3);
    h_layout->addWidget(pbtn_4);

    QVBoxLayout *v_layout = new QVBoxLayout();
    v_layout->addLayout(h_layout);
    v_layout->addSpacing(0);
    v_layout->addWidget(stack_widget);

    ui->centralwidget->setLayout(v_layout);

    connect(pbtn_1, &QPushButton::clicked, [=]() {
        stack_widget->setCurrentIndex(0);
        qDebug() << stack_widget->currentWidget();
        tw_1->start(200);
    });

    connect(pbtn_2, &QPushButton::clicked, [=]() {
        stack_widget->setCurrentIndex(1);
        qDebug() << stack_widget->currentWidget();
        tw_2->start(200);
    });

    connect(pbtn_3, &QPushButton::clicked, [=]() {
        stack_widget->setCurrentIndex(2);
        qDebug() << stack_widget->currentWidget();
        tw_3->start(200);
    });

    connect(pbtn_4, &QPushButton::clicked, [=]() {
        stack_widget->setCurrentIndex(3);
        qDebug() << stack_widget->currentWidget();
        tw_4->start(200);
    });
}

MainWindow::~MainWindow() {
    delete ui;
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

testwidget.cpp

#include "testwidget.h"
#include <QDebug>
#include <QLabel>
#include <QHBoxLayout>
#include <QTimer>

testwidget::testwidget(int num):
    index(num),
    time(0),
    is_run(false){
    qDebug() << "This is the" << index << "widget.";

    QLabel *l_text = new QLabel(QString("widget %1").arg(index));
    QLabel *l_time = new QLabel();

    QHBoxLayout *h_lout = new QHBoxLayout;
    h_lout->addWidget(l_text);
    h_lout->addWidget(l_time);

    this->setLayout(h_lout);


    timer = new QTimer();

    connect(timer, &QTimer::timeout, [=] {
        l_time -> setText(QString("time: %1").arg(time ++));
    });
}

testwidget::~testwidget() {
    if(is_run) {
        is_run = false;
        timer -> stop();
    }
    qDebug() << "widget" << index << "over!";
}

void testwidget::start(int sec) {
    if(!is_run) {
        is_run = true;
        timer -> start(sec);
    }
}

testwidget.h

#ifndef TESTWIDGET_H
#define TESTWIDGET_H

#include <QWidget>

class testwidget: public QWidget
{
    Q_OBJECT
public:
    testwidget(int num);
    ~testwidget();

    void start(int sec);

private:
    int index,
        time;

    bool is_run;

    QTimer *timer;
};

#endif // TESTWIDGET_H

下面是运行后的界面图:
在这里插入图片描述
点击按钮后相对应的被注册的窗体会启动一个定时器,页面切换后定时器依然存在,页面也未被销毁,所以在单个页面开销比较大的时候,切换窗体后记得及时手动关闭窗体正在执行的内容。

学习分享,一起成长!以上为小编的学习分享,若存在不当之处,请批评指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/976308.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【高等数学基础知识篇】——不定积分

文章目录 一、不定积分的概念与基本性质1.1 原函数与不定积分的基本概念1.2 不定积分的基本性质 二、不定积分基本公式与积分法2.1 不定积分基本公式2.2 不定积分的积分法2.2.1 换元积分法2.2.2 分部积分法 三、两类重要函数的不定积分——有理函数与三角有理函数3.1 有理函数的…

架构设计基础设施保障IaaS计算

目录 1 IaaS概述2 服务部署演进历程3 云虚拟机4 云虚拟机如何选型5 云虚拟机的创建操作6 服务部署访问 1 IaaS概述 云计算并不是一种单一类型的产品&#xff0c;而是为满足企业各种IT需求而提供的多种服务。 通过云计算提供的一类这样的服务是基础设施即服务&#xff08;IaaS&a…

蓝桥杯备赛(Day5)——二叉树

二叉树存储 普通做法&#xff0c;二叉树一个节点包括结点的数值以及指向左右子节点的指针 在class Node中 def __init__(self,s,lNone,rNone):self.valNoneself.llself.rr 在竞赛中&#xff0c;我们往往使用静态数组实现二叉树&#xff0c;定义一个大小为N的静态结构体数组…

使用iCloud和Shortcuts实现跨设备同步与自动化数据采集

在如今的数字时代&#xff0c;跨设备同步和自动化数据采集对于提高工作效率和便利性至关重要。苹果的iCloud和Shortcuts App为我们提供了强大的工具&#xff0c;可以实现跨设备同步和自动化数据采集的功能。本文将详细介绍如何利用iCloud和Shortcuts App实现这些功能&#xff0…

英诺森供应链一体化平台解析

近日&#xff0c;2023年中国物流与采购联合会科学技术奖正式公布&#xff0c;该奖项经国家科技部批准&#xff0c;在国家科学技术奖励工作办公室登记备案&#xff0c;是我国物流行业最具影响力的奖项之一。 英诺森联合客户申报的科技项目“英诺森供应链智能数据平台”&#xf…

Golang编写客户端SDK,并开源发布包到GitHub,供其他项目import使用

目录 编写客户端SDK&#xff0c;并开源发布包到GitHub1. 创建 GitHub 仓库2. 构建项目&#xff0c;编写代码Go 代码示例&#xff1a;项目目录结构展示&#xff1a; 3. 提交代码到 GitHub仓库4. 发布版本5. 现在其他人可以引用使用你的模块包了 编写客户端SDK&#xff0c;并开源…

记一次以太网连接失败修复

症状: 很久没用这个电脑了&#xff0c;开机以后&#xff0c;发现连不上校园网。 遂检查网线&#xff0c;发现网线连在自己笔记本是可以用的&#xff0c;说明网线没问题。 但是网线连在主机是红灯常亮黄灯闪烁&#xff0c;怀疑是网卡有问题&#xff08;后证明不是&#xff0c…

成都车展:比亚迪“豹力美学”杀入硬派SUV市场

在熙熙攘攘人头攒动的2023成都国际车展上&#xff0c;如果要评选一家人气最旺的车企展台&#xff0c;那必然非比亚迪莫属。 在比亚迪现场展示的多款车型中&#xff0c;作为比亚迪旗下方程豹品牌的首款车型&#xff0c;以“超级混动硬派SUV”著称的方程豹5&#xff0c;自然吸引了…

nuxt中extendRoutes添加多个扩展路由

文档中https://www.nuxtjs.cn/api/configuration-router有写使用extendRoutes添加多个路由 添加多个路由&#xff0c;数组拼接只能使用push&#xff0c;其实均不管用

【王道】操作系统笔记 第一章 操作系统概述

1.1.1 操作系统的概念和功能 我们熟悉的操作系统有哪些&#xff1f; 从计算机系统的层次结构上看操作系统&#xff1a; 以一台电脑的诞生为例&#xff1a; 第一步&#xff0c;厂家组装一台裸机 第二步&#xff0c;出售前安装操作系统 第三步&#xff0c;用户安装应用程序 第四…

一日一技:Python如何同时调用多个GPT的API?

相信很多同学或多或少都在Python中使用过GPT API&#xff0c;通过Python安装openai库&#xff0c;来调用GPT模型。 OpenAI官方文档中给出了一个示例&#xff0c;如下图所示&#xff1a; OpenAI API 测试 如果你只有一个API账号&#xff0c;那么你可能不觉得这样写有什么问题。…

其他计算机系统基础知识

其他计算机系统基础知识 概述计算机语言多媒体系统工程系统工程方法切克兰德方法并行工程方法综合集成法WSR方法 系统工程的生命周期基于模型的系统工程 概述 不考 学系统工程就行 整体来说考的概率不大&#xff0c;以了解为主 计算机语言 多媒体 15年之前考过 系统工程 系统工…

systemverilog仿真时候传递参数

$test$plusargs和$value$plusarg的区别和使用 本文参考的文章vcs2021 user guiger 别的版本可能会有不一样 纯学习笔记 文章原文 &#xff08; t e s t test testplusargs&#xff09; 在运行时启用调试功能 在“ifdef”编译器指令的位置使用 t e s t test testplusargs系…

web靶场——xss-labs靶机平台的搭建和代码审计

目录 一、web靶场-xss-labs靶机平台的搭建 1、将下载好的压缩包放置php的WWW根目录下 2、配置网站 3、启动MYSQL和Nginx 4、完成后我们就可以在浏览器输入127.0.0.1&#xff1a;8088进入靶场 二、xss-labs靶场通关攻略 第一关&#xff1a; 1、输入代码进行测试&#xf…

Linux——(第三章)Vi和Vim编辑器

目录 1.Vi和Vim的基本介绍 2.Vi和Vim三种模式的切换 3.一般模式 4.编辑模式 5.指令模式 1.Vi和Vim的基本介绍 Vi是Unix操作系统和类Unix操作系统中最通用的文本编辑器。 Vim编辑器是从Vi发展出来的一个性能更强大的文本编辑器。可以主动的以字体颜色辨别语法的正确性&…

Python怎么实现更高效的数据结构和算法? - 易智编译EaseEditing

要实现更高效的数据结构和算法&#xff0c;你可以考虑以下几个方面的优化&#xff1a; 选择合适的数据结构&#xff1a; 选择最适合你问题的数据结构至关重要。例如&#xff0c;如果需要频繁插入和删除操作&#xff0c;可能链表比数组更合适。如果需要高效查找操作&#xff0…

加餐1|辞职问题:古人怎么写高端辞职信?

好诗相伴&#xff0c;千金不换。你好&#xff0c;我是天博。 我们这一讲是加餐&#xff0c;我想聊的是&#xff0c;古人是怎么处理我们现实生活里的一些难题的&#xff0c;比如古人是怎么面试的&#xff0c;怎么辞职的。在加餐里&#xff0c;我不会主讲某首诗&#xff0c;而是…

跨源资源共享(CORS)Access-Control-Allow-Origin

1、浏览器的同源安全策略 没错&#xff0c;就是这家伙干的&#xff0c;浏览器只允许请求当前域的资源&#xff0c;而对其他域的资源表示不信任。那怎么才算跨域呢&#xff1f; 请求协议http,https的不同域domain的不同端口port的不同 好好好&#xff0c;大概就是这么回事啦&…

高效能,一键批量剪辑,AI智剪让创作更轻松

在今天的数字化时代&#xff0c;视频制作已经成为各种行业和领域的必备技能。然而&#xff0c;视频剪辑过程往往繁琐且耗时&#xff0c;大大降低了我们的工作效率。幸运的是&#xff0c;随着人工智能技术的发展&#xff0c;我们有了新的解决方案——AI智剪软件。 AI智剪软件&am…

4年外包出来人废了,5个面试挂了4个....

我的情况 大概介绍一下个人情况&#xff0c;男&#xff0c;毕业于普通二本院校非计算机专业&#xff0c;18年跨专业入行测试&#xff0c;第一份工作在湖南某软件公司&#xff0c;做了接近4年的外包测试工程师&#xff0c;今年年初&#xff0c;感觉自己不能够再这样下去了&…