Qt的对话框与窗口--多文档界面MDI(Multi-document Interface))

news2024/11/16 13:42:19

多文档界面MDI

    MDI应用程序就是在主窗口里创建多个同类型的MDI子窗口,这些MDI子窗口在主窗口里显示,并共享主窗口上的工具栏和菜单等操作功能,主窗口上的操作都针对当前活动的MDI子窗口进行。
设计MDI应用程序需要在主窗口工作区放置一个QMdiArea作为子窗体的容器。

1.主窗口界面设计

要在主窗口实现MDI功能,只需在主窗口的工作区放置一个QMdiArea组件。图1是设计好的主窗口界面。
在这里插入图片描述

图1 设计时的主窗口

在UI设计器里创建Action,并应用Action设计主工具栏。在主窗口的工作区放置一个QMdiArea组件,然后在主窗口的构造函数里设置mdiArea填充满工作区。

QWMainWindow::QWMainWindow(QWidget *parent) :   QMainWindow(parent),
   ui(new Ui::QWMainWindow)
{
   ui->setupUi(this);
   this->setCentralWidget(ui->mdiArea); 
   this->setWindowState(Qt::WindowMaximized);
   ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
}

2.MDI子窗口的创建与加入

下面是主窗口上“新建文档”按钮的响应代码:

void QWMainWindow::on_actDoc_New_triggered()
{ //新建文档
   QFormDoc *formDoc = new QFormDoc(this); 
   ui->mdiArea->addSubWindow(formDoc); //文档窗口添加到MDI
   formDoc->show();  
}

代码功能是新建一个QFormDoc类的窗口formDoc,构造函数中传入了主窗口指针,所以主窗口是formDoc的父窗口,然后使用QMdiArea的addSubWindow()函数将formDoc加入到mdiArea。

下面是主窗口上“打开文档”按钮的响应代码:

void QWMainWindow::on_actDoc_Open_triggered()
{//打开文件
   bool needNew=false;// 是否需要新建子窗口
   QFormDoc   *formDoc;
   if (ui->mdiArea->subWindowList().count()>0) //获取活动窗口
   {
      formDoc=(QFormDoc*)ui->mdiArea->activeSubWindow()->widget();
      needNew=formDoc->isFileOpened();//文件已经打开,需要新建窗口
   }
   else
      needNew=true;

   QString curPath=QDir::currentPath();
   QString aFileName=QFileDialog::getOpenFileName(this,"打开一个文件", 
            curPath, "C程序文件(*.h *cpp);;所有文件(*.*)");
   if (aFileName.isEmpty())
      return; 

   if (needNew) //需要新建子窗口
   {
      formDoc = new QFormDoc(this); 
      ui->mdiArea->addSubWindow(formDoc);
   }
   formDoc->loadFromFile(aFileName); //打开文件
   formDoc->show();
   ui->actCut->setEnabled(true);
   ui->actCopy->setEnabled(true);
   ui->actPaste->setEnabled(true);
   ui->actFont->setEnabled(true);
}

通过QMdiArea::subWindowList()可以获得子窗口对象列表,从而可以判断子窗口的个数。如果没有一个MDI子窗口,就创建一个新的窗口并打开文件。

如果有MDI子窗口,则总有一个活动窗口,通过QMdiArea::activeSubWindow()可以获得此活动的子窗口,通过子窗口的isFileOpened()函数判断是否打开了文件,如果没有打开过文件,就在这个活动窗口里打开文件,否则新建窗口打开文件。

注意: 
一定要先获取MDI子窗口,再使用QFileDialog选择需要打开的文件。如果顺序更换了,则无法获得正确的MDI活动子窗口。

3.QMdiArea常用功能函数

QMdiArea提供了一些成员函数,可以进行一些操作,工具栏上的“关闭全部”“MDI模式”“级联展开”“平铺展开”等按钮都是调用QMdiArea类的成员函数实现的。下面是这几个按钮功能的实现代码:

void QWMainWindow::on_actCascade_triggered()
{ //窗口级联展开
   ui->mdiArea->cascadeSubWindows();
}
void QWMainWindow::on_actTile_triggered()
{//平铺展开
   ui->mdiArea->tileSubWindows();
}
void QWMainWindow::on_actCloseALL_triggered()
{//关闭全部子窗口
   ui->mdiArea->closeAllSubWindows();
}
void QWMainWindow::on_actViewMode_triggered(bool checked)
{//MDI 显示模式
   if (checked) //Tab多页显示模式
   {
      ui->mdiArea->setViewMode(QMdiArea::TabbedView); //Tab多页显示模式
      ui->mdiArea->setTabsClosable(true); //页面可关闭
      ui->actCascade->setEnabled(false);
      ui->actTile->setEnabled(false);
   }
   else //子窗口模式
   {
      ui->mdiArea->setViewMode(QMdiArea::SubWindowView); //子窗口模式
      ui->actCascade->setEnabled(true); 
      ui->actTile->setEnabled(true); 
   }
}

其中,设置MDI视图模式用setViewMode()函数,有两种模式可以选择。

QMdiArea::SubWindowView是传统的子窗口模式。
QMdiArea::TabbedView是多页的显示模式。

4.MDI的信号

QMdiArea有一个信号subWindowActivated(QMdiSubWindow *arg1),在当前活动窗口切换时发射,利用此信号可以在活动窗口切换时进行一些处理,例如,在状态栏里显示活动MDI子窗口的文件名,在没有MDI子窗口时,将工具栏上的编辑功能按钮设置为禁用。下面是该信号的槽函数代码:

void QWMainWindow::on_mdiArea_subWindowActivated(QMdiSubWindow *arg1)
{//当前活动子窗口切换时
   if (ui->mdiArea->subWindowList().count()==0)
   { //若子窗口个数为零
      ui->actCut->setEnabled(false);
      ui->actCopy->setEnabled(false);
      ui->actPaste->setEnabled(false);
      ui->actFont->setEnabled(false);
      ui->statusBar->clearMessage();
   }
   else
   {
      QFormDoc *formDoc=static_cast<QFormDoc*>( 
                   ui->mdiArea->activeSubWindow()->widget());
    ui->statusBar->showMessage(formDoc->currentFileName());
   }
}

主窗口工具栏上的“剪切”“复制”“粘贴”“字体设置”等按钮都是调用当前子窗口的相应函数,关键是获取当前MDI子窗体对象,例如,“剪切”和“字体设置”按钮的代码如下:

void QWMainWindow::on_actCut_triggered()
{ //cut操作
   QFormDoc* formDoc=(QFormDoc*)ui->mdiArea->activeSubWindow()->widget();
   formDoc->textCut();
}
void QWMainWindow::on_actFont_triggered()
{//设置字体
   QFormDoc* formDoc=(QFormDoc*)ui->mdiArea->activeSubWindow()->widget();
   formDoc->setEditFont();
}

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

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

相关文章

MySQL:我的从库竟是我自己!?

本文将通过复制场景下的异常分析,介绍手工搭建MySQL主从复制时需要注意的关键细节。 作者:秦福朗 爱可生 DBA 团队成员,负责项目日常问题处理及公司平台问题排查。热爱互联网,会摄影、懂厨艺,不会厨艺的 DBA 不是好司机…

多行文本转成一行的实现方法

哈喽大家好,我是咸鱼 不知道你们有没有遇到过下面的情况,以我为例 有时候我会收到批量操作服务器的需求,且我会拿到一个服务器 ip 列表,它是一个多行的形式,如下所示 # ip 列表 192.168.0.1 192.168.0.2 192.168.0.…

原油天然气的区别和用途

原油天然气在市场交易中都是重要的交易产品,经常有小伙伴在后台咨询Forexclub,原油天然气的区别和用途,今天这篇文章就和小伙伴一起交流研究。 其实在Forexclub看来原油和天然气的提取方法、来源和用途几乎相同,只是在适用范围和运…

推荐系统构建

从0到1打造推荐系统工程实战_推荐系统_Jay Wu_InfoQ写作社区

并行程序设计 pthread

配置环境 pthread是c的扩展库,需要配置环境,不过vscode的mingw里面本来就有,谢谢呢^_^ cd “d:\sylvia\文件夹等等等” ; if ($?) { g helloworld.cpp -o helloworld } ; //编译 if ($?) { .\helloworld 线程数} //运行 常用变量声明及函…

三雄极光“设计有光·亚洲设计师迪拜对话”逐光之旅圆满收官

7月8日,三雄极光照明学院“设计有光亚洲设计师迪拜对话”游学旅程圆满收官。过去两周内,此次活动备受关注,设计大咖纷纷为此次迪拜游学一带一路逐光之旅打call。出发前,启动礼于三雄极光总部隆重举行,总裁张宇涛出席并…

F - Desktop Rearrangement

大意: 给你一个桌面状态,每次俩种操作桌面可以表示为一个大小为nm的矩形矩阵&#xff0c;由字符.&#xff08;桌面上的空单元格&#xff09;和*&#xff08;一个图标&#xff09;组成。 操作: 输入<x,y>表示改变其状态的单元格的位置&#xff08;如果该单元格以前包含…

如何在.NET 自动安装包项目(Visual Studio Installer Projects)中设置安装包自动安装 .NET Framework环境

如何在.NET 自动安装包项目(Visual Studio Installer Projects)中设置安装包自动安装 .NET Framework环境 前言 ​ Microsoft Visual Studio Installer Projects是一组用于创建安装程序的工具&#xff0c;它是Microsoft Visual Studio的扩展。这些工具允许开发人员在Visual St…

Java开发基础系列(二):数据类型

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; Java开发基础系列(二):数据类型 ⏱️ 创作时间&#xff1a; 2023年07月…

生产消费者模型

生产消费者模型概念 生产消费者模型实际上就是通过一个容器&#xff0c;将生产者和消费者之间的强耦合问题解决掉。 没有使用生产者消费者模型时&#xff0c;生产者和消费者之间直接相互联通&#xff0c;两者之间强耦合&#xff0c;若是一方更换&#xff0c;那另一方也需要随之…

在 Jetpack Compose 中使用 ViewPager

简介 Jetpack Compose 是一个现代化的&#xff0c;声明式的 UI 工具包&#xff0c;让我们可以更方便地构建原生 Android UI。在本篇文章中&#xff0c;我们将会讨论如何在 Jetpack Compose 中使用 ViewPager。 什么是 ViewPager? ViewPager 是一个提供左右滑动切换视图的 U…

DynaSLAM代码详解(2) — Mask RCNN物体检测框架

目录 2.1 前言 2.2 Mask R-CNN优点 2.3 Mask R-CNN框架解析 (1) Mask R-CNN算法步骤 (2) Faster-R-CNN (3) FCN (4) ROIPooling和ROIAlign的分析与比较 (5) Mask R-CNN损失 参考链接&#xff1a; &#xff08;1&#xff09;Mask R-CNN网络详解_fcn太阳花的小绿豆_太…

Java开发专家阿里P6-P7面试题大全及答案汇总(持续更新)二十七、Ribbon和Feign的区别...

一、CPU100%问题如何快速定位 答案 1.执行top -c &#xff0c;显示进程运行信息列表 键入P (大写p)&#xff0c;进程按照CPU使用率排序 2.找到最耗CPU的线程 top -Hp 10765 &#xff0c;显示一个进程的线程运行信息列表 键入P (大写p)&#xff0c;线程按照CPU使用率排序 …

IDEA集成Maven

目录 配置Maven环境 创建Maven项目 Maven坐标 导入Maven项目 Maven依赖管理&#xff08;核心&#xff09; 配置Maven环境 两种方法 每没创建一个maven项目都需要在项目中配置一遍在所有设置中进行全局设置&#xff0c;适用于所有的maven项目 步骤 在idea的初始界面中找到所…

ASEMI整流桥2W10的结构特点和应用领域

编辑-Z 整流桥2W10是一种常用的电子元件&#xff0c;用于将交流电转换为直流电。本文将从工作原理、结构特点、应用领域和发展趋势四个方面对整流桥2W10进行详细阐述。 工作原理 整流桥2W10是由四个二极管组成的桥式整流电路。当输入的交流电信号通过整流桥时&#xff0c;根据…

文心大模型3.5完成内测

据报道&#xff0c;日前&#xff0c;百度文心大模型3.5版本已经完成内测应用&#xff0c;并在三大公开测试集上展现了出色的表现&#xff0c;其综合能力评测得分已经超过ChatGPT&#xff0c;部分中文能力甚至超越了GPT-4。 根据《中国科学报》的报道&#xff0c;3月份&#xf…

2023年全球零信任现状报告发布丨面临集成挑战,如何突破知易行难?

近日&#xff0c;专注网络与安全融合的全球网络安全领导者Fortinet&#xff08;NASDAQ&#xff1a;FTNT&#xff09;宣布发布《2023年全球零信任现状报告》及其调查发现。该报告揭示了零信任安全当前部署和实施现状&#xff0c;以及 IT 团队在应对后疫情时代的混合办公模式的安…

还找不到好用的UI设计工具,来看这篇

即时设计是一个基于云的在线协作工具&#xff0c;专门为国产设计团队打造。与其它在线协作工具相比&#xff0c;即时设计具有更强的项目团队合作功能&#xff0c;也更容易实现上手操作。它可以帮助企业或团队从0到1的创建、测试和交付的设计项目。在即时设计的帮助下&#xff0…

更快地分割任何事物:面向移动应用的轻量级Sam

文章目录 摘要1、简介2、相关工作3、适合移动设备的SAM3.1、背景和项目目标3.2、提出方法 4、实验4.1、实验设置4.2、MobileSAM的性能与原版SAM相当4.3、MobileSAM优于FastSAM 5、结论 摘要 https://arxiv.org/pdf/2306.14289v2.pdf 分割任何事物模型(SAM)因其令人印象深刻的零…

健身器材BS EN ISO 20957标准

健身器材出口欧洲需要符合CE认证的 BS EN ISO 20957标准&#xff0c;而且 BS EN ISO 20957规定了固定训练设备的安全要求和试验方法&#xff0c;也就是固定训练设备在使用过程中的一般安全要求。这包括用于体育协会&#xff0c;教育机构&#xff0c;酒店&#xff0c;体育馆&…