首页 > 编程语言 >C++ Qt开发:MdiArea多窗体组件

C++ Qt开发:MdiArea多窗体组件

时间:2023-12-19 09:11:53浏览次数:39  
标签:窗口 Qt QMdiArea C++ mdiArea ui 模式 窗体 MdiArea

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

QMdiArea(Multiple Document Interface Area)是Qt中用于创建多文档界面的组件。它提供了一种在单个窗口中管理多个文档的方式,每个文档通常是一个子窗口(QMdiSubWindow)。该组件主要用于设计多文档界面应用程序,具备有多种窗体展示风格,实现了在父窗体中内嵌多种子窗体的功能,使开发者能够轻松地创建支持多个文档的应用程序。

下面是一些常用的QMdiArea的方法,说明并概述成表格:

方法 说明
QMdiArea(QWidget *parent = nullptr) 构造函数,创建一个QMdiArea实例。
addSubWindow(QWidget *widget, Qt::WindowFlags flags = Qt::WindowFlags()) 将指定的QWidget添加为QMdiArea的子窗口。
cascadeSubWindows() 将所有子窗口进行层叠排列。
tileSubWindows() 平铺排列所有子窗口。
closeAllSubWindows() 关闭所有子窗口。
setBackground(const QBrush &background) 设置QMdiArea的背景色或背景图片。
setViewMode(QMdiArea::ViewMode mode) 设置子窗口排列模式,例如QMdiArea::SubWindowViewQMdiArea::TabbedView
setTabsClosable(bool closable) 设置子窗口标签是否可关闭。
setTabsMovable(bool movable) 设置子窗口标签是否可移动。
setTabShape(QTabWidget::TabShape shape) 设置子窗口标签的形状,例如QTabWidget::RoundedQTabWidget::Triangular
setDocumentMode(bool enabled) 设置是否以文档模式显示子窗口标签。
setTabPosition(QTabWidget::TabPosition position) 设置子窗口标签的位置,例如QTabWidget::NorthQTabWidget::South
setActivationOrder(QMdiArea::ActivationOrder order) 设置子窗口的激活顺序,例如QMdiArea::StackingOrderQMdiArea::CreationOrder
setTabbedView(bool tabbed) 将QMdiArea设置为标签视图,即子窗口以标签页的形式显示。
setOption(QMdiArea::AreaOption option, bool on = true) 设置QMdiArea的选项,例如QMdiArea::DontMaximizeSubWindowOnActivation
activeSubWindow() 返回当前激活的子窗口,如果没有激活的子窗口则返回nullptr。
closeActiveSubWindow() 关闭当前激活的子窗口。

这只是一些常用方法的概述,实际上QMdiArea提供了更多的方法和选项,以满足不同应用场景的需求。开发者可以根据具体需求查阅官方文档获取更详细的信息。

读者在使用MDI组件时,需要在UI界面中增加mdiArea控件容器,之后所有窗体创建与操作都要在容器内进行,其次由于MDI窗体组件仅仅是一个画布只具备限制窗口的作用,无法实现生成窗体,所以需要在项目中手动增加自定义Dialog对话框,并对该对话框进行一定的定制,首先绘制如下案例,其顶部是一个QToolBar组件,底部则是一个QMidArea组件,如下图;

接着我们需要以此对上述菜单绑定一个唯一的名称及文本,这个过程可以通过代码实现,也可以通过图形化配置,如下图我们直接通过图形化模式增加其功能;

1.1 初始化控件

如下代码,使用QMdiArea创建多文档界面的MainWindow类的构造函数和析构函数。

下面是一些关键点的概述:

  1. QMdiArea设置为中央窗口:
    • this->setCentralWidget(ui->mdiArea);QMdiArea设置为主窗口的中央窗口,表示主要的工作区域将由QMdiArea管理。
  2. 主窗口最大化显示(注释部分):
    • this->setWindowState(Qt::WindowMaximized); 这是一行注释掉的代码,表示将主窗口设置为最大化显示。你可以根据需要取消注释,以便在启动应用程序时窗口最大化。
  3. 工具栏设置:
    • ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); 设置工具栏按钮的显示风格为图标下方显示文本。这种设置在工具栏上同时显示图标和文本,提供了更直观的用户界面。
  4. 子窗口模式设置:
    • ui->mdiArea->setViewMode(QMdiArea::SubWindowView);QMdiArea的视图模式设置为子窗口模式。在子窗口模式下,QMdiArea管理并显示各个子窗口,允许用户同时查看和编辑多个文档。
  5. 析构函数:
    • 析构函数中执行了 delete ui;,确保在对象销毁时释放与ui相关的资源,避免内存泄漏。

这段代码片段展示了一个使用QMdiArea创建多文档界面的主窗口类的基本结构和初始化设置。在这个窗口中,用户可以打开和管理多个子窗口,每个子窗口可以包含一个独立的文档。

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

    // 窗口最大化显示
    // this->setWindowState(Qt::WindowMaximized);
    ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);

    // 子窗口模式
    ui->mdiArea->setViewMode(QMdiArea::SubWindowView);
}

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

程序打开后可以看到如下图所示的界面;

1.2 新建与关闭窗体

新建窗体时只需要调用new Dialog创建新的窗体,并通过addSubWindow()将新的窗体指针加入到组件内即可,当关闭时可以直接通过调用closeAllSubWindows()来实现,如下代码则是创建与关闭的实现。

// 新建窗体
void MainWindow::on_actionOpen_triggered()
{
    // 创建Dialog窗体
    Dialog *formDoc = new Dialog(this);

    // 文档窗口添加到MDI
    ui->mdiArea->addSubWindow(formDoc);

    // 在单独的窗口中显示
    formDoc->show();
}

// 关闭全部
void MainWindow::on_actionClose_triggered()
{
    // 关闭所有子窗口
    ui->mdiArea->closeAllSubWindows();
}

运行后可以点击打开窗体创建,这个创建是无限制的,如下图;

1.3 转换窗体模式

针对模式的转换此处提供了三种模式,分别是MDI模式、级联模式及平铺模式,三种模式的实现只需要调用不同的接口即可实现,代码如下所示;

// 转为MDI模式
void MainWindow::on_actionMID_triggered(bool checked)
{
    // Tab多页显示模式
    if (checked)
    {
        // Tab多页显示模式
        ui->mdiArea->setViewMode(QMdiArea::TabbedView);
        // 页面可关闭
        ui->mdiArea->setTabsClosable(true);
        ui->actionLine->setEnabled(false);
        ui->actionTile->setEnabled(false);
    }
    // 子窗口模式
    else
    {
        // 子窗口模式
        ui->mdiArea->setViewMode(QMdiArea::SubWindowView);
        ui->actionLine->setEnabled(true);
        ui->actionTile->setEnabled(true);
    }
}

// 恢复默认模式
void MainWindow::on_actionWindow_triggered()
{
    ui->mdiArea->setViewMode(QMdiArea::SubWindowView);
    ui->actionLine->setEnabled(true);
    ui->actionMID->setEnabled(true);
    ui->actionTile->setEnabled(true);
}

// 级联模式
void MainWindow::on_actionLine_triggered()
{
    ui->mdiArea->cascadeSubWindows();
}

// 平铺模式
void MainWindow::on_actionTile_triggered()
{
    ui->mdiArea->tileSubWindows();
}

子窗口模式(QMdiArea::SubWindowView)

  • 这是多文档界面的默认模式,允许用户在主窗口内同时打开多个子窗口,每个子窗口可以包含一个独立的文档或视图。
  • 子窗口可以重叠、平铺、级联等方式排列。

标签页多页显示模式(QMdiArea::TabbedView)

  • 在这种模式下,子窗口以标签页的形式显示在主窗口的顶部,用户可以通过点击标签页来切换不同的子窗口。
  • 提供了标签页的关闭按钮,允许用户关闭特定的标签页。

级联模式和平铺模式

  • 这两种模式是在标签页多页显示模式下的两种特定排列方式。
  • 级联模式(Cascade): 子窗口以重叠的方式显示,类似级联排列的效果,方便用户查看和操作每个子窗口。

  • 平铺模式(Tile): 子窗口以平铺的方式显示,使它们在主窗口中均匀分布,方便用户同时浏览多个子窗口内容。

这些模式提供了不同的用户体验,使用户能够根据实际需求选择最适合他们工作流程的窗口排列方式。用户可以根据应用程序的性质和自己的使用偏好在这些模式之间切换。

完整案例下载

标签:窗口,Qt,QMdiArea,C++,mdiArea,ui,模式,窗体,MdiArea
From: https://www.cnblogs.com/LyShark/p/17909890.html

相关文章

  • C++基础 -9- 函数的默认参数
     ———————函数的默认参数——————— ......
  • c/c++中typedef定义结构体内成员赋初值
    写数据结构作业时遇到的问题:需要给typedef定义的结构体中的成员数组赋初值。如下:写数据结构作业时遇到的问题:需要给typedef定义的结构体中的成员数组赋初值。如下:typedefstruct{Node*nodes[maxsize];intfront,rear;}Queue;赋值方法如下:Queuenodes={{0},1,0};......
  • 不容错过的 13 个顶级 C++ 程序库
    不容错过的13个顶级C++程序库Incredibuild​已认证账号​关注 135人赞同了该文章关于C++,不论是其长达40年的发展历史,或者C++是高级还是低级编程语言的争论等等,这些内容都已老生常谈。如果你对C++库有所研究,不用我多说,大家也都心中......
  • cpp: enum in C,C++
    C:C11以上第一种方式:/***@fileduLangMap.h*@authorgeovindu,GeovinDu([email protected])*@briefvscodec11*@version0.1*@date2023-12-18**@copyrightCopyright(c)站在巨人的肩膀上StandingontheShouldersofGiants2023**/#ifnd......
  • C++图的邻接表创建
    C++图的邻接表存储结构typedefstructNode{ intnextVex; structNode*next; }*node;structHeadNode{ Eelement; structNode*next;};typedefstructGraphTable{ intvex,edge; structHeadNodeVertex[MAXV];}*Graph;图的创建函数Graphcreate(){ Grap......
  • 29道C++ 面向对象高频题整理(附答案背诵版)
    1、什么是类?在C++中,类是一种用户定义的数据类型,它可以包含数据成员和函数成员。数据成员用于存储与类相关的状态,而函数成员可以定义对这些数据进行操作的方法。可以把类想象为一个蓝图,根据这个蓝图可以创建对象,这些对象在内存中是类的实例。比如说,我们可以定义一个Car类来表示汽......
  • 2023最新中级难度C++面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-中级难度C++面试题合集问:什么是虚函数和纯虚函数?它们有什么区别?虚函数是一种在基类中声明的函数,它可以在派生类中被覆盖以实现多态性。纯虚函数是一种特殊的虚函数,它没有定义任何具体的行为,只声明了一个接口。纯虚函数的目的是为了让......
  • 2023最新高级难度C++面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-高级难度C++面试题合集问:详细解释一下C++中的虚继承(virtualinheritance)的概念及其应用场景。虚继承是一种特殊的继承方式,用于解决多重继承中可能出现的菱形继承问题。菱形继承会导致基类被复制多次,占用额外的内存,并可能导致数据混乱......
  • pyqt5 子窗口的创建,以及主窗口和子窗口的通信
    使用designer画好ui,注意选择dialog对话框然后将ui文件转换成py目标和源文件换成你自己的pyuic5-oqt_hgbp.pyhtbp_autotest.ui主窗口调用子窗口方法一:常规调用,importsysfromPyQt5.QtWidgetsimportQApplication,QMainWindow,QDialog##引入主窗口ui转py文件fr......
  • C++ new与delete
    C++new与delete在C语言中,动态分配内存时一般常使用malloc()函数,但是对于非内置数据类型(如struct、enum、class),malloc()与free()无法满足动态对象的需求,因此C++引入new与delete关键字,用来进行内存申请与释放空间。1.new运算符new运算符用来申请一块连续的内存,其格式如下:new......