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

HarmonyOS开发实战( Beta5版)合理使用动画丢帧规范实践
本文列举了部分用于优化动画时延的正反案例,帮助开发者在遇到相似场景时进行优化,解决构建页面动画时遇到动画时延较长的问题。 减少动画丢帧 在播放动画或者生成动画时,画面产生停滞而导致帧率过低的现象,称为动画丢帧。 播放…...

基于BiLSTM-CRF的医学命名实体识别研究(下)模型构建
一.生成映射字典 接下来需要将每个汉字、边界、拼音、偏旁部首等映射成向量。所以,我们首先需要来构造字典,统计多少个不同的字、边界、拼音、偏旁部首等,然后再构建模型将不同的汉字、拼音等映射成不同的向量。 在prepare_data.py中自定义…...

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

VMWARE VCENTER6.7 VCSA通过Web5480进行版本升级
VCENTER当前版本如下图 操作前先给VCENTER打一个快照,出问题可以立即回退 1、先下载VCSA镜像,并将VCSA镜像上传至DataStore中; 2、选中VCSA虚拟机,编辑配置 3、挂载新上传的VCSA镜像,一定要勾选“已连接”和“打开电源…...
GIT使用常见问题
如何安装Git? 在Windows操作系统中,可以从Git官方网站(https://git-scm.com)下载最新的Git安装程序,然后按照提示进行安装。在Mac操作系统中,可以使用Homebrew或者直接从Git官方网站下载安装程序进行安装。…...
内核链表
一、特点 灵活性 内核链表可以连接各种不同类型的数据结构,因为它只包含指向下一个和上一个节点的指针,不依赖特定的数据类型,这使得内核开发者可以根据不同的需求灵活地使用它。你可以将不同类型的结构体通过内核链表连接起来,实…...

行空板上YOLO和Mediapipe视频物体检测的测试
Introduction 经过前面三篇教程帖子(yolov8n在行空板上的运行(中文),yolov10n在行空板上的运行(中文),Mediapipe在行空板上的运行(中文))的介绍,…...
【Spring Boot 3】【Web】ProblemDetail
【Spring Boot 3】【Web】ProblemDetail 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花…...

市占率最高的显示器件,TFT_LCD的驱动系统设计--Part 1
目录 一、简介 二、TFT-LCD驱动系统概述 (一)系统概述 (二)设计要点 二、扫描驱动电路设计 (一)概述 扫描驱动电路的功能 扫描驱动电路的组成部分 设计挑战 驱动模式 (二)…...
Linux基础 -- 获取CPU负载信息
Linux Kernel 获取当前负载情况 本文档介绍了如何在 Linux 内核中获取系统的负载情况。我们将从用户态程序、内核模块开发等角度展示相关方法。 1. 通过 /proc/loadavg 文件获取负载 /proc/loadavg 文件包含了系统的负载信息,通常包括过去 1 分钟、5 分钟和 15 分…...

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

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

日志系统前置知识
日志:程序运行过程中所记录的程序运行状态信息。通过这些信息,以便于程序员能够随时根据状态信息,对系统的运行状态进行分析。功能:能够让用户非常简便的进行日志的输出以及控制。 同步写日志 同步日志是指当输出日志时ÿ…...
【Spring Boot 3】【Web】全局异常处理
【Spring Boot 3】【Web】全局异常处理 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费…...
Dcoker 运行es
1,创建network docker network create my-network 2,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:Zynq-7000 All Programmable SoC Packaging and Pinout...

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

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

生信机器学习入门4 - scikit-learn训练逻辑回归(LR)模型和支持向量机(SVM)模型
通过逻辑回归(logistic regression)建立分类模型 1.1 逻辑回归可视化和条件概率 激活函数 (activation function): 一种函数(如 ReLU 或 S 型函数),用于对上一层的所有输入进行求加权和,然后生…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...