通俗易懂玩QT:QStackedWidget 学习

这篇具有很好参考价值的文章主要介绍了通俗易懂玩QT:QStackedWidget 学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

下面是运行后的界面图:
通俗易懂玩QT:QStackedWidget 学习,QT学习,qt,qstackedwidget
点击按钮后相对应的被注册的窗体会启动一个定时器,页面切换后定时器依然存在,页面也未被销毁,所以在单个页面开销比较大的时候,切换窗体后记得及时手动关闭窗体正在执行的内容。

学习分享,一起成长!以上为小编的学习分享,若存在不当之处,请批评指正!文章来源地址https://www.toymoban.com/news/detail-695230.html

到了这里,关于通俗易懂玩QT:QStackedWidget 学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Qt5.12】Qt5.12安装教程[通俗易懂]

    Qt5.12下载网址: Index of /archive/qt/5.12/5.12.2 选择Windows平台, Linux和Mac平台类似 下载好之后的安装包: Step1: 双击安装包, 稍等片刻, 然后点击next Step2: 如果没有账号, 则选择skip Step3: Qt设置欢迎界面, 选择下一步 Step4: 选择安装路径 Step5: 选择组件, 然后选择下一步 Step6: 同意许可协议

    2024年02月13日
    浏览(41)
  • 使用QToolButton和QStackedWidget的侧边栏(SideBar)的实现与实现原理解析

    原文链接:https://blog.csdn.net/qq153471503/article/details/128528072 Demo下载:https://gitee.com/jhuangBTT/QtSideBar 1、简介 侧边栏是一个很常用的导航控件,如Qt Creator软件本身也使用到了侧边栏: 目前使用Qt做出这种侧边导航栏,常见的做法是使用QListWidget加QStackedWidget,但是使用QListWidget做侧

    2023年04月27日
    浏览(23)
  • Qt学习笔记之二--创建一个简单的qt互动界面(超级无敌巨详细,0基础也能会,主打的就是图多,语句通俗)

      选择第一个选项,然后两个下一步------ 直到   这里要选择基类,我们选择Qwiget  至于为什么,可以看看我收藏的这篇博客QMainWindow和QWidget的区别_qwidget和qmainwindow_独行侠_阿涛的博客-CSDN博客 ok,创建完成后,我们使用快捷键Ctrl+R来运行一下,看看是否会弹出小窗口,弹出说

    2024年02月05日
    浏览(50)
  • 机器学习算法:UMAP 深入理解(通俗易懂!)

    UMAP 是 McInnes 等人开发的新算法。与 t-SNE 相比,它具有许多优势,最显着的是提高了计算速度并更好地保留了数据的全局结构。降维是机器学习从业者可视化和理解大型高维数据集的常用方法。最广泛使用的可视化技术之一是 t-SNE,但它的性能受到数据集规模的影响,并且正

    2024年02月16日
    浏览(41)
  • Linux 基础入门(学习笔记通俗易懂版)

    本文章是学习了Linux的学习记录,着重记录了我对于Linux各命令的用法与感悟, 欢迎各位大佬批评指正 记录者:CYH-BI 记录日期:2023年7月7日 本篇文章将使用 虚拟机并安装centos 进行实操。关于虚拟机的安装请看其他教程,篇幅过长,不一展示。 Linux简介部分 Linux起初由Linus

    2024年02月08日
    浏览(46)
  • 【深度学习-神经网络架构-通俗易懂的入门课程】

    AI 包括 机器学习 包括 深度学习 目前深度学习的算法表现更好 数据获取 特征工程 建立模型 评估与应用 特征、算法 特征决定了模型的上限,算法和参数决定了如何去逼近这个基线 问题:传统的机器学习算法,在数据规模上升时,效果无法提升 模型如何搭建? 领域都有成型

    2024年02月16日
    浏览(40)
  • PyTorch深度学习快速入门教程(绝对通俗易懂!!!)

    1.官网下载最新版Anaconda,完成后打开Anaconda Prompt,显示(base)即安装成功 2. conda create -n pytorch python=3.6 建立一个命名为pytorch的环境,且环境python版本为3.6 3. conda activate pytorch 激活并进入pytorch这个环境;linux:source activate pytorch 4. pip list 来查看环境内安装了哪些包,可以发现并

    2024年02月16日
    浏览(38)
  • 深度学习:使用nanodet训练自己制作的数据集并测试模型,通俗易懂,适合小白

    关于目标检测的模型有很多, nanodet 模型小且轻量化,适合移植部署到硬件设备上,非常推荐学习这个模型。经过我自己踩了无数坑后总结了此教程,助学刚接触nanodet,想要快速上手的学者,教程很详细,学者耐心看。 我提供了一个已经调试好的源码包,后面的教程也都是

    2024年02月15日
    浏览(37)
  • 最通俗易懂的讲解HTTPS的加密原理【多图、易懂】

    目录 前言 HTTPS加密原理概述 HTTP 为什么不安全 安全通信的四大原则 HTTPS 通信原理 对称加密:HTTPS 的最终加密形式 非对称加密:解决单向的对称密钥的传输问题 数字证书:解决公钥传输信任问题 证书一整个被掉包怎么办? 总结 其它 HTTPS 相关问题 什么是双向认证? 什么是

    2024年02月05日
    浏览(52)
  • useVModel()的使用------通俗易懂

    用于父子组件共享数据, 1、父组件有个flag(Boolean)属性 2、将flag属性传递给子组件,要实现双向数据绑定 3、flag属性在子组件发生变化,父组件的flag属性一起改变 父组件app.vue 1、父组件有flag属性,使得flag和子组件uniInput双向绑定 2、使用v-model:flag进行双向绑定,v-model的默

    2024年01月15日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包