当前位置: 首页 > news >正文

Qt TabWidget添加多个窗口,实现分页窗体布局

Qt TabWidget添加多个窗口窗体,可关闭与打开

点击按钮可判断是否打开,避免重复打开

使用Qt中的TabWidget组件创建一个简单的分页窗体布局。点击按钮时,会新增一个窗体并添加到TabWidget中。每个子窗体能动态获取父窗体指针以进行操作

分别创建一个mainwindow和两个widget窗体文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void closeEvent(QCloseEvent* e);int IsOpened(QString title);QString GetTableNumber();
private slots:void on_pushButton_clicked();void on_tabWidget_tabCloseRequested(int index);void on_tabWidget_currentChanged(int index);private:Ui::MainWindow *ui;int cur = 1;
};
#endif // MAINWINDOW_H

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "form2.h"
#include "form3.h"
#include <QMessageBox>
#include <QPushButton>
#include <QToolButton>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);ui->tabWidget->setVisible(true);ui->tabWidget->clear();//清除所有页面//ui->tabWidget->tabsClosable(); //Page有关闭按钮,可被关闭ui->tabWidget->setTabsClosable(true);QPushButton *btn1 = new QPushButton;btn1->setText("开始");btn1->setIcon(QIcon(":/new/prefix1/button_Log_icon2.ico"));// ui->toolBar->addWidget(btn1);QPushButton *btn2 = new QPushButton;btn2->setText("暂停");//  ui->toolBar->addWidget(btn2);QToolButton *tbtn = new QToolButton;tbtn->setText("复位");tbtn->setIcon(QIcon(":/new/prefix1/button_Log_icon2.ico"));tbtn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); //图像在上,文字在下ui->toolBar->addWidget(tbtn);QToolButton *tbtn2 = new QToolButton;tbtn2->setText("设置");tbtn2->setIcon(QIcon(":/new/prefix1/best_quality_2.png"));tbtn2->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); //图像在上,文字在下ui->toolBar->addWidget(tbtn2);connect(tbtn,&QToolButton::clicked,this,[=]{Form2 *ptr =new Form2(this);//关闭时自动销毁ptr->setAttribute(Qt::WA_DeleteOnClose);Form3 *ptr3 =new Form3(this);//关闭时自动销毁ptr3->setAttribute(Qt::WA_DeleteOnClose);int tb_index =IsOpened(tbtn->text());if(tb_index>=0){ui->tabWidget->setCurrentIndex(tb_index) ;return;}//  if(cur%2==0){cur = ui->tabWidget->addTab(ptr,tbtn->text());//QString::asprintf("192.168.1.%d",ui->tabWidget->count()));}//  else{//cur = ui->tabWidget->addTab(ptr3,QString::asprintf("test%d",ui->tabWidget->count()));}ui->tabWidget->setTabIcon(cur,QIcon(":/new/prefix1/button_Log_icon2.ico"));ui->tabWidget->setCurrentIndex(cur) ;});connect(tbtn2,&QToolButton::clicked,this,[=]{Form2 *ptr =new Form2(this);//关闭时自动销毁ptr->setAttribute(Qt::WA_DeleteOnClose);Form3 *ptr3 =new Form3(this);//关闭时自动销毁ptr3->setAttribute(Qt::WA_DeleteOnClose);int tb_index =IsOpened(tbtn2->text());if(tb_index>=0){ui->tabWidget->setCurrentIndex(tb_index) ;return;}//  if(cur%2==0){//   cur = ui->tabWidget->addTab(ptr,QString::asprintf("192.168.1.%d",ui->tabWidget->count()));}//  else{cur = ui->tabWidget->addTab(ptr3,tbtn2->text());//QString::asprintf("test%d",ui->tabWidget->count()));}ui->tabWidget->setTabIcon(cur,QIcon(":/new/prefix1/best_quality_2.png"));ui->tabWidget->setCurrentIndex(cur) ;});}/**********************************************
* @projectName   %{CurrentProject:Name}
* @brief         function_name...
* @param         void
* @return        void
* @author        cdtxw@foxmail.com/ by txwtech
* @date          2024-09-05
**********************************************/// 定义函数来获取当前Table名字
QString MainWindow::GetTableNumber()
{QString ref = QString(ui->tabWidget->currentIndex());return ref;
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::closeEvent(QCloseEvent* e)
{QMessageBox::information(this,"title","main window will be closed");
}/**********************************************
* @projectName   %{CurrentProject:Name}
* @brief         是否打开
* @param         void
* @return        void
* @author        cdtxw@foxmail.com/ by txwtech
* @date          2024-09-05
**********************************************/int MainWindow::IsOpened(QString title)
{int tab_count = ui->tabWidget->count();int window_count =0;if(window_count==0){window_count = -1;}for(int x=0;x<tab_count;x++)//获取出每个菜单的标题{QString tab_name = ui->tabWidget->tabText(x);if(tab_name==title){window_count = x;break;}else if(x==tab_count){window_count = -1;}}return window_count;}/**********************************************
* @projectName   %{CurrentProject:Name}
* @brief         添加窗口
* @param         void
* @return        void
* @author        cdtxw@foxmail.com/ by txwtech
* @date          2024-09-05
**********************************************/void MainWindow::on_pushButton_clicked()
{//新建选项卡Form2 *ptr =new Form2(this);//关闭时自动销毁ptr->setAttribute(Qt::WA_DeleteOnClose);Form3 *ptr3 =new Form3(this);//关闭时自动销毁ptr3->setAttribute(Qt::WA_DeleteOnClose);if(cur%2==0){cur = ui->tabWidget->addTab(ptr,QString::asprintf("192.168.1.%d",ui->tabWidget->count()));}else{cur = ui->tabWidget->addTab(ptr3,QString::asprintf("test%d",ui->tabWidget->count()));}ui->tabWidget->setTabIcon(cur,QIcon(":/new/prefix1/button_Log_icon2.ico"));ui->tabWidget->setCurrentIndex(cur) ;ui->tabWidget->setVisible(true);}void MainWindow::on_tabWidget_tabCloseRequested(int index)
{if (index<0)return;auto aa= QMessageBox::question(this,"tips","window will be closed",QMessageBox::Yes,QMessageBox::No);if(aa==QMessageBox::No){return;}QWidget* aForm=ui->tabWidget->widget(index);aForm->close();}void MainWindow::on_tabWidget_currentChanged(int index)//
// 在无Tab页面是默认禁用
{Q_UNUSED(index);bool en=ui->tabWidget->count()>0;// ui->tabWidget->setVisible(en);
}

工程代码:

https://download.csdn.net/download/txwtech/89715631 

相关文章:

Qt TabWidget添加多个窗口,实现分页窗体布局

Qt TabWidget添加多个窗口窗体&#xff0c;可关闭与打开 点击按钮可判断是否打开&#xff0c;避免重复打开 使用Qt中的TabWidget组件创建一个简单的分页窗体布局。点击按钮时&#xff0c;会新增一个窗体并添加到TabWidget中。每个子窗体能动态获取父窗体指针以进行操作 分别…...

HarmonyOS开发实战( Beta5版)合理使用动画丢帧规范实践

本文列举了部分用于优化动画时延的正反案例&#xff0c;帮助开发者在遇到相似场景时进行优化&#xff0c;解决构建页面动画时遇到动画时延较长的问题。 减少动画丢帧 在播放动画或者生成动画时&#xff0c;画面产生停滞而导致帧率过低的现象&#xff0c;称为动画丢帧。 播放…...

基于BiLSTM-CRF的医学命名实体识别研究(下)模型构建

一.生成映射字典 接下来需要将每个汉字、边界、拼音、偏旁部首等映射成向量。所以&#xff0c;我们首先需要来构造字典&#xff0c;统计多少个不同的字、边界、拼音、偏旁部首等&#xff0c;然后再构建模型将不同的汉字、拼音等映射成不同的向量。 在prepare_data.py中自定义…...

5.sklearn-朴素贝叶斯算法、决策树、随机森林

文章目录 环境配置&#xff08;必看&#xff09;头文件引用1.朴素贝叶斯算法代码运行结果优缺点 2.决策树代码运行结果决策树可视化图片优缺点 3.随机森林代码RandomForestClassifier()运行结果总结 本章学习资源 环境配置&#xff08;必看&#xff09; Anaconda-创建虚拟环境…...

VMWARE VCENTER6.7 VCSA通过Web5480进行版本升级

VCENTER当前版本如下图 操作前先给VCENTER打一个快照&#xff0c;出问题可以立即回退 1、先下载VCSA镜像&#xff0c;并将VCSA镜像上传至DataStore中&#xff1b; 2、选中VCSA虚拟机&#xff0c;编辑配置 3、挂载新上传的VCSA镜像&#xff0c;一定要勾选“已连接”和“打开电源…...

GIT使用常见问题

如何安装Git&#xff1f; 在Windows操作系统中&#xff0c;可以从Git官方网站&#xff08;https://git-scm.com&#xff09;下载最新的Git安装程序&#xff0c;然后按照提示进行安装。在Mac操作系统中&#xff0c;可以使用Homebrew或者直接从Git官方网站下载安装程序进行安装。…...

内核链表

一、特点 灵活性 内核链表可以连接各种不同类型的数据结构&#xff0c;因为它只包含指向下一个和上一个节点的指针&#xff0c;不依赖特定的数据类型&#xff0c;这使得内核开发者可以根据不同的需求灵活地使用它。你可以将不同类型的结构体通过内核链表连接起来&#xff0c;实…...

行空板上YOLO和Mediapipe视频物体检测的测试

Introduction 经过前面三篇教程帖子&#xff08;yolov8n在行空板上的运行&#xff08;中文&#xff09;&#xff0c;yolov10n在行空板上的运行&#xff08;中文&#xff09;&#xff0c;Mediapipe在行空板上的运行&#xff08;中文&#xff09;&#xff09;的介绍&#xff0c;…...

【Spring Boot 3】【Web】ProblemDetail

【Spring Boot 3】【Web】ProblemDetail 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花…...

市占率最高的显示器件,TFT_LCD的驱动系统设计--Part 1

目录 一、简介 二、TFT-LCD驱动系统概述 &#xff08;一&#xff09;系统概述 &#xff08;二&#xff09;设计要点 二、扫描驱动电路设计 &#xff08;一&#xff09;概述 扫描驱动电路的功能 扫描驱动电路的组成部分 设计挑战 驱动模式 &#xff08;二&#xff09…...

Linux基础 -- 获取CPU负载信息

Linux Kernel 获取当前负载情况 本文档介绍了如何在 Linux 内核中获取系统的负载情况。我们将从用户态程序、内核模块开发等角度展示相关方法。 1. 通过 /proc/loadavg 文件获取负载 /proc/loadavg 文件包含了系统的负载信息&#xff0c;通常包括过去 1 分钟、5 分钟和 15 分…...

Django 中的用户界面 - 创建速度计算器

在 Django 中创建一个用户界面来计算速度&#xff0c;可以通过以下步骤完成。这个速度计算器将允许用户输入距离和时间&#xff0c;计算并显示速度。 一、问题背景 一位 Django 新手希望使用 Django 构建一个用户界面&#xff0c;以便能够计算速度&#xff08;速度 距离/时间…...

spring security 如何解决跨域的

一、什么是 CORS CORS(Cross-Origin Resource Sharing) 是由 W3C制定的一种跨域资源共享技术标准&#xff0c;其目就是为了解决前端的跨域请求。在JavaEE 开发中&#xff0c;最常见的前端跨域请求解决方案是早期的JSONP&#xff0c;但是JSONP 只支持 GET 请求&#xff0c;这是一…...

日志系统前置知识

日志&#xff1a;程序运行过程中所记录的程序运行状态信息。通过这些信息&#xff0c;以便于程序员能够随时根据状态信息&#xff0c;对系统的运行状态进行分析。功能&#xff1a;能够让用户非常简便的进行日志的输出以及控制。 同步写日志 同步日志是指当输出日志时&#xff…...

【Spring Boot 3】【Web】全局异常处理

【Spring Boot 3】【Web】全局异常处理 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费…...

Dcoker 运行es

1&#xff0c;创建network docker network create my-network 2&#xff0c;docker运行es容器 docker run -d --name es-container --net my-network -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" docker.elastic.co/elasticsearch/elasticsearch:7…...

7系列FPGA HR/HP I/O区别

HR High Range I/O with support for I/O voltage from 1.2V to 3.3V. HP High Performance I/O with support for I/O voltage from 1.2V to 1.8V. UG865&#xff1a;Zynq-7000 All Programmable SoC Packaging and Pinout...

sqli-labs靶场通关攻略(五十一到六十关)

sqli-labs-master靶场第五十一关 步骤一&#xff0c;尝试输入?sort1 我们发现这关可以报错注入 步骤二&#xff0c;爆库名 ?sort1 and updatexml(1,concat(0x7e,database(),0x7e),1)-- 步骤三&#xff0c;爆表名 ?sort1 and updatexml(1,concat(0x7e,(select group_conc…...

c语言中的动态内存管理

在 C 语言中&#xff0c;动态内存管理主要通过以下几个函数实现&#xff1a; 一、malloc 函数 功能&#xff1a; malloc 函数用于在内存的动态存储区中分配一块长度为 size 字节的连续区域。函数返回一个指向分配区域起始地址的指针&#xff0c;如果分配失败则回 NULL 示例: …...

生信机器学习入门4 - scikit-learn训练逻辑回归(LR)模型和支持向量机(SVM)模型

通过逻辑回归&#xff08;logistic regression&#xff09;建立分类模型 1.1 逻辑回归可视化和条件概率 激活函数 (activation function)&#xff1a; 一种函数&#xff08;如 ReLU 或 S 型函数&#xff09;&#xff0c;用于对上一层的所有输入进行求加权和&#xff0c;然后生…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...