QTabWidget动态生成标签页

目的

最近有一个需求实现QTabWidget上面标签页的动态化,上面的功能是一样的,其实就是一种分类的功能,就好像一个本子,自己可以打标签,这样用起来,的确方便很多。

下面就用一个简单的成绩管理系统为例,实现了标签页的管理

不多说了,直接上实现过程。

实现过程

关于QTabWidget的介绍:

QTabWidget是一个容器类控件,它允许开发者在单个窗口中创建多个选项卡(Tab),每个选项卡都可以包含不同的子控件或窗口部件,如文本框、按钮、列表、图片查看器等。用户可以通过点击不同的选项卡来切换显示的内容,从而在一个界面中管理多个工具或数据集。

具体代码实现

实现模板页的关键代码:

cpp 复制代码
#pragma execution_character_set("utf-8")
#include "pageTemplateWidget.h"
PageTemplateWidget::PageTemplateWidget(QWidget *parent) : QWidget(parent)
{
    QVBoxLayout* mainVLayout = new QVBoxLayout(this);
    this->setLayout(mainVLayout);
    m_tableWidget = new QTableWidget(80, 4, this);
    mainVLayout->addWidget(m_tableWidget);
    QStringList headers;
    headers << "学号" << "姓名" << "课目" << "成绩"; // 根据需要添加更多列名
    m_tableWidget->setHorizontalHeaderLabels(headers); // 设置表头名称
}

实现主体架构的关键代码:

cpp 复制代码
#pragma execution_character_set("utf-8")
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->m_centralWidget = new QWidget(this);
    this->setCentralWidget(m_centralWidget);
    QVBoxLayout *mainVLayout = new QVBoxLayout();
    m_centralWidget->setLayout(mainVLayout);
    m_splitter = new QSplitter(Qt::Horizontal, this);
    mainVLayout->addWidget(m_splitter);
    m_groupLeft = new QGroupBox(this);
    m_groupRight = new QGroupBox(this);
    m_splitter->addWidget(m_groupLeft);
    m_splitter->addWidget(m_groupRight);
    m_splitter->setStretchFactor(0, 8);
    m_splitter->setStretchFactor(1, 3);
    m_vLayoutLeft = new QVBoxLayout(this);
    m_groupLeft->setLayout(m_vLayoutLeft);
    m_vLayoutRight = new QVBoxLayout(this);
    m_groupRight->setLayout(m_vLayoutRight);
    m_tabWidget = new QTabWidget(this);
    m_vLayoutLeft->addWidget(m_tabWidget);
    m_btnAddTabWidget = new QPushButton(this);
    m_btnAddTabWidget->setText("添加标签页");
    m_vLayoutRight->addWidget(m_btnAddTabWidget);
    connect(m_btnAddTabWidget, &QPushButton::clicked, this, &MainWindow::on_btnAddTabWidget_clicked);
    m_addTabDialog = new AddTabDialog();
    this->setWindowTitle("学生成绩管理系统");
}
MainWindow::~MainWindow()
{
}
void MainWindow::on_btnAddTabWidget_clicked()
{
    if(m_addTabDialog)
    {
        if(m_addTabDialog->exec() == QDialog::Accepted)
        {
            QString tabName = m_addTabDialog->getTabName();
            PageInfo pageInfo;
            pageInfo.tabName = tabName;
            pageInfo.pageTemplateWidget = std::make_shared<PageTemplateWidget>(this->m_centralWidget);
            m_pageList.append(pageInfo);
            m_tabWidget->addTab(m_pageList.last().pageTemplateWidget.get(), m_pageList.last().tabName);
        }
    }
}

实现效果:

视频里的效果:

动态生成标签页

图片里的效果:

上面实现了标签的添加。

关于类与对象的定义

C++类定义

定义一个类,本质上是定义一个数据类型的模板。实际上并没有定义任何数据。也就是说,它定义了类的对象包括了什么,以及可以在这个对象上执行哪些操作。

类定义是以关键字class开头,后跟类的名称。类的主体是包含在一对花括号中,类定义后必须跟着一个分号或者一个声明列表。

定义C++对象

类提供了对象的蓝图或模板,基本上对象是根据类来创建的,声明类的对象,就像声明基本类型的变量一样。

总结

标签页实现过程很简单,就是先写一个页面模板,然后根据这一个模板,生成相应页面,就可以了,如果细想一下的话,也就是抽象与具体的关系,抽象的是类,具体的是对象,页面类就是抽象了,抽象里面,都是抽象信息了,有页面的名字,页面里的表格;生成的具体页面就是具体的对象了,把抽象的东西落到了实处,比如标签名字,有了具体叫什么名了,这好像是基因与具体人的关系一样,基因描述了人是什么样子,什么性格,然后,一个人就是一类基因的具体实现了。

这种关系如下:

项目下载地址:https://download.csdn.net/download/maokexu123/91057469

相关推荐
一匹电信狗2 小时前
【高阶数据结构】并查集
c语言·数据结构·c++·算法·leetcode·排序算法·visual studio
PPPPPaPeR.2 小时前
从零实现一个简易 Shell:理解 Linux 进程与命令执行
linux·开发语言·c++
LXS_3572 小时前
C++常用容器(下)---stack、queue、list、set、map
开发语言·c++·学习方法·改行学it
愚者游世2 小时前
list Initialization各版本异同
开发语言·c++·学习·程序人生·算法
.小墨迹2 小时前
apollo中车辆的减速绕行,和加速超车实现
c++·学习·算法·ubuntu·机器学习
恒者走天下2 小时前
操作系统内核项目面经分享
c++
WBluuue2 小时前
数据机构与算法:dp优化——倍增优化
c++·算法·leetcode·动态规划
YYYing.2 小时前
【Linux/C++进阶篇(二) 】超详解自动化构建 —— 日常开发中的“脚本” :Makefile/CMake
linux·c++·经验分享·ubuntu
范纹杉想快点毕业2 小时前
嵌入式实时系统架构设计:基于STM32与Zynq的中断、状态机与FIFO架构工程实战指南,基于Kimi设计
c语言·c++·单片机·嵌入式硬件·算法·架构·mfc
玖釉-2 小时前
核心解构:Cluster LOD 与 DAG 架构深度剖析
c++·windows·架构·图形渲染