TabWidget中插入ui文件子界面作为 tab的子页

  • 需求:在TabWidget中布置控件过多,且布局设计页面中tab子页面一直自动切换不方便操作;
  • 实现:另外插入.ui文件及对应的h/cpp文件,注意选择widget,把设计的页面当做控件使用;
  1. 把设计的widget插入tabwidget的tab页中一是把tab子页当做父亲widget = new QWidget(tab); 二是 在tab叶中先插入布局,然后使用verticalLayout->addWidget(widget);
  2. 我这里采用两者结合,先在tab叶的 ui 中放入虚拟布局,然后 再使用 addWidget 函数
  3. 我们在使用布局ui时通常是先放入所有控件,然后进行一一布局,但是在使用代码布局时,首先要确定的就是布局,然后再往布局塞控件,我的理解是,想使用代码布局,首先要“胸有成竹”;
  4. 当ui文件作为控件插入到别的界面时,无需设置无边框 setWindowFlags(Qt::FramelessWindowHint);//无边框,系统自动去边框(已验证)。

1 UI文件

1.1 mainwindow.ui

​ 主界面放一个tabWidget,分别放入两个tab页,每个tab页中放入一个verticalLayout;

mainwindow.ui

1.2 子界面ui

​ 两个子界面均放入一个label和一个弹簧(verticalSpacer),为了区分,一个放在上面,一个放下面;
SubWidget_2
SubWidget_2.ui

2 头文件

2.1 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "SubWidget_1.h"
#include "SubWidget_2.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

2.2 SubWidget_1.h

#ifndef SUBWIDGET_1_H
#define SUBWIDGET_1_H

#include <QWidget>

namespace Ui {
class SubWidget_1;
}

class SubWidget_1 : public QWidget
{
    Q_OBJECT

public:
    explicit SubWidget_1(QWidget *parent = nullptr);
    ~SubWidget_1();

private:
    Ui::SubWidget_1 *ui;
};

#endif // SUBWIDGET_1_H

2.3 SubWidget_2.h

#ifndef SUBWIDGET_2_H
#define SUBWIDGET_2_H

#include <QWidget>

namespace Ui {
class SubWidget_2;
}

class SubWidget_2 : public QWidget
{
    Q_OBJECT

public:
    explicit SubWidget_2(QWidget *parent = nullptr);
    ~SubWidget_2();

private:
    Ui::SubWidget_2 *ui;
};

#endif // SUBWIDGET_2_H

3 源文件

3.1 mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    SubWidget_1 *s1 = new SubWidget_1(this);
    ui->verticalLayout_1->addWidget(s1);

    SubWidget_2 *s2 = new SubWidget_2(ui->tab_2);
    ui->verticalLayout_2->addWidget(s2);
}

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


3.2 `SubWidget_1.cpp

#include "SubWidget_1.h"
#include "ui_SubWidget_1.h"

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

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

3.3 SubWidget_2.cpp

#include "SubWidget_2.h"
#include "ui_SubWidget_2.h"

SubWidget_2::SubWidget_2(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SubWidget_2)
{
    ui->setupUi(this);
//    setWindowFlags(Qt::FramelessWindowHint);//无边框 不起作用
}

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

3.4 main.cpp

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

4 运行截图

运行截图1
(设置了渐变色,还挺好看O.o)
运行截图2

  • Qt练习时长两年半,接qt,C++兼职,课设,指导等;
  • VX:QAQ2333oooo
  • QQ:1580947517
### 如何在 QTabWidget 中添加 Tab 面 要在 `QTabWidget` 中添加一个新的 Tab 面,可以使用其内置方法 `addTab(QWidget *page, const QString &label)`。此方法接受两个参数:一个是作为面内容的小部件(QWidget),另一个是该标签的名称。 以下是实现这一功能的具体代码示例: ```cpp #include <QApplication> #include <QTabWidget> #include <QWidget> #include <QPushButton> #include <QVBoxLayout> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建主窗口和 QTabWidget 实例 QWidget window; QVBoxLayout layout(&window); QTabWidget tabWidget; // 创建第一的内容 QWidget page1; QPushButton buttonPage1("这是第一", &page1); QVBoxLayout layoutPage1(&page1); layoutPage1.addWidget(&buttonPage1); // 将第一添加到 QTabWidget 并设置标签名 tabWidget.addTab(&page1, "首"); // 创建第二的内容 QWidget page2; QPushButton buttonPage2("这是第二", &page2); QVBoxLayout layoutPage2(&page2); layoutPage2.addWidget(&buttonPage2); // 将第二添加到 QTabWidget 并设置标签名 tabWidget.addTab(&page2, "配置"); // 设置布局并将 QTabWidget 放入主窗口 layout.addWidget(&tabWidget); window.resize(400, 300); window.show(); return app.exec(); } ``` 上述代码展示了如何向 `QTabWidget` 添加多个 Tab 面,并为每个面指定一个小部件作为内容容器[^3]。 #### 关键说明 - **addTab 方法**:通过调用 `addTab()` 可以轻松地将新的 Tab 面及其关联的小部件加入到 `QTabWidget` 中。 - **setTabText 方法**:如果需要动态修改某个 Tab 的标题,则可以通过索引号来调整它。例如,`ui->tabWidget->setTabText(index, "新标题");`。 - **removeTab 和 clear 方法**:当不再需要某些 Tabs 或者希望完全清理所有的 Tabs 时,分别有对应的移除单个 Tab (`removeTab()`) 和一次性清除全部 Tabs (`clear()`) 的操作可用。 #### 动态管理 Tabs 示例 下面是一个简单的例展示如何隐藏/显示特定的 Tab 面以及重新加载它们的内容结构: ```cpp // 假设我们已经有一个名为 ui 的指针指向我们的界面对象 ui->tab->hideTab(0); // 隐藏第一个 Tab ui->tab->showTab(0); // 显示刚才隐藏的第一个 Tab 面 // 如果想要替换掉现有的表单布局并插入新的控件序列... if (existingFormLayout) { delete existingFormLayout; // 清理旧有的布局实例 } QFormLayout* newFormLayout = new QFormLayout(ui->someContainerWidget); newFormLayout->addRow("字段A:", QLineEdit()); newFormLayout->addRow("字段B:", QComboBox()); ``` 以上片段基于自定义类扩展了基本的功能[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花乾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值