C++ Qt开发:TabWidget实现多窗体功能

这篇具有很好参考价值的文章主要介绍了C++ Qt开发:TabWidget实现多窗体功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TabWidget标签组件的常用方法及灵活运用。

QTabWidget 是Qt中用于实现标签页(tabbed interface)的控件,可以在一个窗口内切换不同的页面。在开发窗体应用时通常会伴随功能的分页,使用TabWidget并配合自定义Dialog组件,即可实现一个复杂的多窗体分页结构,此类布局方式也是多数软件通用的方案。

以下是 QTabWidget 的一些常用方法,以表格形式概述:

方法签名 描述
QTabWidget(QWidget *parent = nullptr) 构造函数,创建一个 QTabWidget 对象。
int addTab(QWidget *page, const QString &label) 添加一个标签页,参数 page 为标签页的内容,label 为标签页的标签文本。返回新添加标签页的索引。
void insertTab(int index, QWidget *page, const QString &label) 在指定索引位置插入一个标签页。
void removeTab(int index) 移除指定索引位置的标签页。
int currentIndex() const 返回当前活动标签页的索引。
void setCurrentIndex(int index) 设置当前活动标签页的索引。
QWidget *currentWidget() const 返回当前活动标签页的内容窗口。
int count() const 返回标签页的总数。
QWidget *widget(int index) const 返回指定索引位置的标签页的内容窗口。
QString tabText(int index) const 返回指定索引位置的标签页的标签文本。
void setTabText(int index, const QString &text) 设置指定索引位置的标签页的标签文本。
QIcon tabIcon(int index) const 返回指定索引位置的标签页的图标。
void setTabIcon(int index, const QIcon &icon) 设置指定索引位置的标签页的图标。
void clear() 移除所有标签页。
void setMovable(bool movable) 设置标签页是否可移动。默认为可移动。
void setTabEnabled(int index, bool enable) 设置指定索引位置的标签页是否可用。
bool isTabEnabled(int index) const 返回指定索引位置的标签页是否可用。
int indexOf(QWidget *page) const 返回指定内容窗口所在的标签页的索引。
QWidget *widget(const QString &label) const 返回具有指定标签文本的标签页的内容窗口。

这些方法可以帮助你在 QTabWidget 中动态地管理标签页,设置标签文本、图标,以及进行标签页的切换和管理。

1.1 重复窗体分页

重复窗体的使用广泛应用于标签页克隆,例如一些远程SSH工具每次打开标签都是一个重复的交互环境,唯一不同的只是IP地址的变化,对于这些重复打开的标签页面就可以使用此分页来解决。

首先实现如下窗体布局,布局中空白部分是一个TabWidget分页组件,下方是一个PushButton按钮,当用户点击按钮时,自动将Dialog窗体追加到TabWidget组件中,如下图;

C++ Qt开发:TabWidget实现多窗体功能

首先读者需要新建一个名叫FormDoc.ui的标准对话框,并在FormDoc构造函数中对该窗体进行初始化,如下代码则是自定义 FormDoc 类的实现,该类继承自 QWidget。在构造函数中,创建了垂直布局管理器 QVBoxLayout,并设置了一些边距和间距。然后,通过 setLayout 将这个布局管理器应用到 FormDoc 类的对象上。

在构造函数中,通过 parentWidget() 获取了父窗口指针,并通过强制类型转换将其转为 MainWindow* 类型。接着,通过调用 GetTableNumber() 方法获取了选中标签的索引,然后将其输出到控制台。此处的GetTableNumber()是父类中的函数,主要用于返回当前TabWidget组件的下标。

#include "formdoc.h"
#include "ui_formdoc.h"
#include "mainwindow.h"

#include <QVBoxLayout>
#include <iostream>

FormDoc::FormDoc(QWidget *parent) :QWidget(parent),ui(new Ui::FormDoc)
{
    ui->setupUi(this);

    QVBoxLayout *Layout = new QVBoxLayout();
    Layout->setContentsMargins(2,2,2,2);
    Layout->setSpacing(2);
    this->setLayout(Layout);

    // 获取父窗口指针
    MainWindow *parWind = (MainWindow*)parentWidget();

    // 获取选中标签索引
    QString ref = parWind->GetTableNumber();
    std::cout << ref.toStdString().data() << std::endl;
}

FormDoc::~FormDoc()
{
    delete ui;
}

接着来看下MainWindow主窗体中是如何实现创建窗体的,当用户点击PushButton按钮时,首先new FormDoc新建一个空的窗体,并通过 addTab 方法将 FormDoc 实例添加到 QTabWidget 中,设置了选项卡的显示文本为 IP 地址("192.168.1.x")以及对应的图标。然后,通过 setCurrentIndex 将新建的选项卡设置为当前选中,并通过 setVisible(true) 确保 QTabWidget 是可见的。

另外,该主窗口还实现了一个槽函数 on_tabWidget_tabCloseRequested,当某个选项卡被关闭时触发。在这个槽函数中,首先获取被关闭的选项卡对应的 QWidget 指针,然后调用 close 方法关闭选项卡。需要注意的是,如果在关闭选项卡时需要执行一些清理工作,可以在 FormDoc 类的析构函数中进行相应的处理。

void MainWindow::on_pushButton_clicked()
{
    // 新建选项卡
    FormDoc *ptr = new FormDoc(this);

    // 关闭时自动销毁
    ptr->setAttribute(Qt::WA_DeleteOnClose);

    int cur = ui->tabWidget->addTab(ptr,QString::asprintf(" 192.168.1.%d",ui->tabWidget->count()));

    ui->tabWidget->setTabIcon(cur,QIcon(":/image/1.ico"));

    ui->tabWidget->setCurrentIndex(cur);
    ui->tabWidget->setVisible(true);
}

// 关闭Tab时执行
void MainWindow::on_tabWidget_tabCloseRequested(int index)
{
    if (index<0)
        return;
    QWidget* aForm=ui->tabWidget->widget(index);
    aForm->close();
}

程序运行后读者可以点击创建窗体按钮,每次点击都会创建一个独立的新窗体,如下图所示;

C++ Qt开发:TabWidget实现多窗体功能

1.2 独立窗体分页

1.1节中,笔者所介绍的方法仅用于重复功能页面的创建,而有时我们需要让不同的窗口展示不同的功能,此时就需要实现多窗体,通过ToolBarTabWidget组件的配合可以很好的实现多窗体的应用,如下图通过ToolBar配置一个按钮组件并初始化图标。

C++ Qt开发:TabWidget实现多窗体功能

接着对窗体中的菜单栏依次绑定一个名称,其中名称使用action开头,如下图所示;

C++ Qt开发:TabWidget实现多窗体功能

接着我们分别创建三个与之对应的Dialog对话框,其中actionMain对应formmain.uiactionOption对应到formoption.uiactionCharts对应到formcharts.ui上面,当首页按钮被点击后,在MainWindow中执行如下操作,首先判断窗体是否打开了,如果打开了则不允许继续打开新的,而如果没有被打开,那么我们就新建一个窗口,并设置到TabWidget上面,其代码如下所示;

// 首页菜单创建
void MainWindow::on_actionMain_triggered()
{
    int tab_count = ui->tabWidget->count();
    int option_count = 0;

    for(int x=0; x < tab_count; x++)
    {
        // 获取出每个菜单的标题
        QString tab_name = ui->tabWidget->tabText(x);

        if(tab_name == "首页菜单")
            option_count = option_count + 1;
    }

    if(option_count < 1)
    {
        FormMain *ptr = new FormMain(this);              // 新建选项卡
        ptr->setAttribute(Qt::WA_DeleteOnClose);         // 关闭时自动销毁

        int cur=ui->tabWidget->addTab(ptr,QString::asprintf("首页菜单"));
        ui->tabWidget->setTabIcon(cur,QIcon(":/image/1.ico"));

        ui->tabWidget->setCurrentIndex(cur);
        ui->tabWidget->setVisible(true);
    }
}

系统设置页面同理,这里我们规定系统设置页面也只能打开一个,其代码如下所示;

// 创建系统设置菜单
void MainWindow::on_actionOption_triggered()
{
    int tab_count = ui->tabWidget->count();
    int option_count = 0;

    for(int x=0; x < tab_count; x++)
    {
        // 获取出每个菜单的标题
        QString tab_name = ui->tabWidget->tabText(x);

        if(tab_name == "系统设置")
            option_count = option_count + 1;
    }

    // 判断首页菜单是否只有一个,可判断标签个数来识别
    if(option_count < 1)
    {
        FormOption *ptr = new FormOption(this);
        ptr->setAttribute(Qt::WA_DeleteOnClose);

        int cur = ui->tabWidget->addTab(ptr,QString::asprintf("系统设置"));
        ui->tabWidget->setTabIcon(cur,QIcon(":/image/2.ico"));

        ui->tabWidget->setCurrentIndex(cur);
        ui->tabWidget->setVisible(true);
    }
}

最后一个是图形绘制按钮,该按钮我们让其可以弹出多个,此处就不再限制弹出数量,只要点击按钮就新建一个并追加到TabWidget中,代码如下所示;

// 绘图页面的弹出
void MainWindow::on_actionCharts_triggered()
{
    FormCharts *ptr = new FormCharts(this);

    ptr->setAttribute(Qt::WA_DeleteOnClose);

    int cur = ui->tabWidget->addTab(ptr,QString::asprintf("图形绘制"));
    ui->tabWidget->setTabIcon(cur,QIcon(":/image/3.ico"));

    ui->tabWidget->setCurrentIndex(cur);
    ui->tabWidget->setVisible(true);
}

运行后读者可依次点击不同的按钮实现子窗体的创建,如下图所示;

C++ Qt开发:TabWidget实现多窗体功能

附件下载

TabWidget文章来源地址https://www.toymoban.com/news/detail-760241.html

到了这里,关于C++ Qt开发:TabWidget实现多窗体功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 06-1_Qt 5.9 C++开发指南_对话框与多窗体设计_标准对话框

    在一个完整的应用程序设计中,不可避免地会涉及多个窗体、对话框的设计和调用,如何设计和调用这些对话框和窗体是搞清楚一个庞大的应用程序设计的基础。本章将介绍对话框和多窗体设计、调用方式、数据传递等问题,主要包括以下几点。 Qt 提供的标准对话框的使用,

    2024年02月13日
    浏览(32)
  • 【Flutter跨平台插件开发】如何实现kotlin跟C++的相互调用

    在 Kotlin 中,可以使用 JNI (Java Native Interface) 来调用 C++ 代码 调用步骤: 创建 C++ 文件并实现函数。 在 Kotlin 中声明需要调用的 native 函数并加载 native 库。 调用示例 Flutter 插件项目的例子 在 Flutter 插件中引用已有的 C++ 源码需要以下步骤: 首先,在 Flutter 插件的 android 目录下

    2024年01月25日
    浏览(34)
  • 一站式解决方案:Qt 跨平台开发灵活可靠

    一站式解决方案:Qt 跨平台开发灵活可靠 Qt 是一种跨平台开发工具,为开发者提供了一站式解决方案。无论您的项目目标是 Windows、Linux、macOS、嵌入式系统还是移动平台,Qt 都能胜任。这种跨平台的特性不仅节省开支,还推动了战略的快速落地。 适用范围广泛:Qt 可在多种

    2024年02月07日
    浏览(36)
  • 跨平台C++ Qt数据库管理系统设计与实战:从理论到实践的全面解析

    在我们的日常生活中,数据无处不在。无论是我们的个人信息,还是我们的购物习惯,甚至是我们的工作记录,都可以被视为数据。这些数据的管理和处理,对于个人和企业来说,都是至关重要的。这就是数据库管理系统(Database Management System,简称DBMS)的重要性所在。 数据

    2024年02月06日
    浏览(39)
  • 基于Avalonia 11.0.0+ReactiveUI 的跨平台项目开发2-功能开发

    项目简介 :目标是开发一个跨平台的AI聊天和其他功能的客户端平台。目的来学习和了解Avalonia。将这个项目部署在openKylin 1.0 的系统上。 为什么使用Avalonia :之前已经了解了基于Avalonia的项目在国产麒麟系统中运行的案例。正是Avalonia在跨平台的出色表现,学习和了解Avalon

    2024年02月17日
    浏览(33)
  • 我想开发一款跨平台桌面软件,请告诉我qt、electron、tauri、pyqt、flutter分别适合开发哪些跨平台桌面

    不同的跨平台桌面开发工具适用于不同的应用场景和开发者需求。以下是关于 Qt、Electron、Tauri、PyQt、Flutter 的简要说明,以帮助你更好地选择适合你项目的工具: Qt: 适用场景: Qt 是一个强大的 C++ 框架,适用于开发需要高性能和原生外观的桌面应用。它具有广泛的平台支持

    2024年02月22日
    浏览(43)
  • 【Visual Studio】Qt 的实时绘图曲线功能,使用 C++ 语言,配合 Qt 开发串口通信界面

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 战斗背景:做了个串口接收界面,用来接收传输过来的信号。但是光用数字显示太单调,需要用图线显示出来。 战略目标:干掉它。 战术路线:Qt 绘图可以使用 Qt Charts,先了解

    2024年02月11日
    浏览(38)
  • Qt实现改变无标题栏窗体大小及移动窗体

    目录 1.问题的提出 2.实现方法 3.存在的问题 一般情况下,当去掉窗体标题栏时,按住鼠标左键就无法实现拖动窗体;当去掉窗体标题栏时,窗体四周的边框也去掉了,此时按住鼠标左键拖动窗体四周边沿,无法实现鼠标拖动改变窗体大小。如下为Qt实现去掉窗体标题栏的代码

    2024年02月13日
    浏览(28)
  • C++库封装mongodb(跨平台开发)

    目录 1.开发环境准备 2.编译mongo-c-driver (linux环境)  3.编译mongo-c-driver (windows环境)

    2024年02月11日
    浏览(34)
  • 【Visual Studio】使用 C++ 语言,配合 Qt,开发了一个串口通信界面

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 我要使用的功能比较简单,主要包含扫描串口、打开串口、发送数据、接收数据、暂停按钮、停止按钮,因此接下里将围绕这几个功能依次更新。 我的工程项目名字叫 “GUI”。

    2024年02月11日
    浏览(55)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包