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

news2024/9/24 23:23:33

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

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

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

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

#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();
    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 

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

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

相关文章

SpringBoot2:请求处理原理分析-接口参数解析原理

一、知识回顾 我们知道&#xff0c;接口的参数&#xff0c;一般都要配上注解来一起使用。 不同的参数注解&#xff0c;决定了传参的方式不同。 为什么会这样&#xff1f; 如果让你设计接口参数解析&#xff0c;你会怎么做&#xff1f; 本篇就来探究springboot底层是如何通过参…

又发现一个国内超好用的 AI 开放平台!

首先&#xff0c;我认为一个好的人工智能开放平台应该具备以下关键特性&#xff1a;提供多种AI模型和工具&#xff0c;涵盖自然语言处理、计算机视觉、语音识别、数据分析等多个领域。 满足不同应用领域的需求&#xff1b;需具备强大的计算资源&#xff0c;以支持大规模模型的…

K线图新玩法:利用Pin Bar精准捕捉市场反转

对于交易者来说&#xff0c;K线图是必备工具之一&#xff0c;所谓K线图就是由一系列的蜡烛形状组成&#xff0c;每个蜡烛代表一定时间周期内的价格变动情况。而有一种交易策略就是依据蜡烛形态预测市场趋势情况&#xff0c;这种交易策略被叫做Pin Bar交易法。 Pin Bar是什么&am…

高效智能 | 客户运营与知识库管理系统的融合策略

在当今快速变化的商业环境中&#xff0c;企业不仅要关注产品的创新和市场的拓展&#xff0c;更需要深耕客户运营&#xff0c;以提升客户满意度和忠诚度。而知识库管理系统作为支撑客户运营的重要工具&#xff0c;其与企业客户运营策略的深度融合&#xff0c;正成为企业提升核心…

畅捷通如何远程访问

畅捷通如何远程访问 越来越多的企业选择了畅捷通ERP来提升管理效率与资源整合能力。然而&#xff0c;随之而来的远程访问问题却成为了不少用户的困扰。作为一名畅捷通ERP的使用者&#xff0c;我深刻体会到&#xff0c;如何高效、便捷地进行远程访问是实现企业数字化管理的关键。…

软件测试之UI自动化测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、about自动化测试 定义&#xff1a;把人为驱动的测试转化为机器执行的一种过程&#xff0c;重点在于持续集成这个概念&#xff1b; 优势&#xff1a;节约人力和…

DDoS对策是什么?详细解说DDoS攻击难以防御的理由和对策方法

攻击规模逐年增加的DDoS攻击。据相关调查介绍&#xff0c;2023年最大的攻击甚至达到了700Gbps。 为了抑制DDoS攻击的危害&#xff0c;采取适当的对策是很重要的。 特别是在网站显示花费时间或频繁出现504错误的情况下&#xff0c;可能已经受到了DDoS攻击&#xff0c;需要尽早采…

代理IP中的API接口:解锁高效与自动化的网络访问新方式

“在当今数字化时代&#xff0c;网络数据的获取与分析已成为各行各业不可或缺的一部分。随着网络环境的日益复杂和网站反爬机制的升级&#xff0c;直接使用原始IP地址进行数据采集或网络访问变得越来越困难。此时&#xff0c;代理IP作为一种有效的解决方案&#xff0c;成为了众…

网络编程 0905作业

作业 1、流式域套接字敲一遍。 服务器 server.c 代码 #include <myhead.h> #define BACKLOG 10int main(int argc, const char *argv[]) {//1、创建流式域套接字int oldfd socket(AF_UNIX,SOCK_STREAM,0);if(oldfd -1){perror("socket");return -1;}//2、…

盘点2024年热门的4款高效的AI写作软件

AI 写作的魅力在于它可以在短时间内完成一篇结构完成整&#xff0c;逻辑清晰的文章内容&#xff1b;并且能够理解用户的需求&#xff0c;然后使用丰富的词汇和句式帮助表达出来。现在各种AI写作软件有很多&#xff0c;为了能够帮助大家更好的解决写作问题&#xff0c;我找了4个…

[001-07-001].第1节:Redis中的BigKey使用分析

我的后端学习大纲 我的Redis学习大纲 1、MorKey分析&#xff1a; 1.1.数据准备&#xff1a; a.大批量往Redis中插入100W数据: 1.Linux Bash下面执行如下命令&#xff0c;是将100万条命令写入到temp目录下的一个临时文件中&#xff1a; 2.通过redis提供的管道–prpe命令插入1…

期权时间价值是什么?期权时间价值的影响分析

今天带你了解期权时间价值是什么&#xff1f;期权时间价值的影响分析。期权会随时间的流逝价值递减。这个特点有利月义务仓(卖出开仓)&#xff0c;不利于权利仓(买入开仓)。远期合约消耗慢&#xff0c;近期合约消耗快。实值合约消耗慢&#xff0c;虚值合约消耗快。 期权管理时…

企业精英引领未来,大数据讲座照亮中职学子职业航道

为深化校企合作模式&#xff0c;加速产教融合步伐&#xff0c;搭建起职业教育与职场世界的无缝对接桥梁&#xff0c;唯众企业携手武汉市第二职业教育中心&#xff08;简称“武汉二职”&#xff09;&#xff0c;共同举办了一场别开生面的专题讲座。此次活动不仅促进了企业与学生…

MOS管烧毁的原因

MOS管作为电子设备中常用的功率开关器件&#xff0c;因其高效能、低导通损耗和快速开关速度&#xff0c;广泛应用于各类电源、电机控制和电力电子系统中。然而&#xff0c;在实际应用中&#xff0c;MOS管烧毁的现象时有发生&#xff0c;通常伴随着电路故障或设计问题。 1. 过…

Circuitjs 的选项设置

选项设置位于 “菜单–选项” 下, 包含显示, 定位, 编辑, 颜色等方面的设置项. 显示电流 勾选后, 导线及元件中会有小点在不断移动, 以模拟电流的移动. 小点移动的速度还反应了电流的大小. 移动快说明电流大, 移动慢说明电流小. 另: 小点移动的速度还受右侧栏 “电流速度” …

Nginx location 和 proxy_pass 配置详解

概述 Nginx 配置中 location 和 proxy_pass 指令的不同组合方式及其对请求转发路径的影响。 配置效果 1. location 和 proxy_pass 都带斜杠 / location /api/ {proxy_pass http://127.0.0.1:8080/; }访问地址&#xff1a;www.hw.com/api/upload转发地址&#xff1a;http://…

模型案例:| 网球识别模型

导读 2023年以ChatGPT为代表的大语言模型横空出世&#xff0c;它的出现标志着自然语言处理领域取得了重大突破。它在文本生成、对话系统和语言理解等方面展现出了强大的能力&#xff0c;为人工智能技术的发展开辟了新的可能性。同时&#xff0c;人工智能技术正在进入各种应用领…

minio实现大文件断点续传

最近工作中遇到一个需求&#xff0c;用户需要上传大文件几百M&#xff0c;为了更好的用户体验&#xff0c;需要支持断点续传&#xff0c;秒传&#xff0c;上传进度条等功能。需求如下&#xff1a; 方案有两种&#xff1a; 第一种&#xff1a;前端直接将整个大文件丢到后端&…

嵌入式初学-C语言-数据结构--四

栈 1. 基本概念 栈是一种逻辑结构&#xff0c;是特殊的线性表。特殊在&#xff1a; 只能在固定的一端操作 只要满足上述条件&#xff0c;那么这种特殊的线性表就会呈现一种“后进先出”的逻辑&#xff0c;这种逻辑就被称为栈。栈 在生活中到处可见&#xff0c;比如堆叠的盘子…

蓝牙串口模块JDY-31(基于STM32F103C8T6HAL库)

1.蓝牙模块简介 1.1 蓝牙模块简介 蓝牙串口模块用于单片机和手机之间的通信&#xff0c; JDY-31有6针脚和4针脚版本&#xff0c;6针脚插中间4根即可。 JDY-31是一个从机&#xff0c;HC-05是主从机一体的。HC-05使用的时候需要进行配对&#xff0c;JDY-31使用的时候不需要配对…