mdi窗体如何调用子窗体函数

MDI多窗体组件,主要用于设计多文档界面应用程序,该组件具备有多种窗体展示风格,其实现了在父窗体中内嵌多种子窗体的功能,使用MDI组件需要在UI界面中增加mdiArea控件容器,我们所有的窗体创建与操作都在这个容器内进行,如下我们将具体介绍该组件的常用使用技巧。

MDI窗体控件类似于画布,该控件只具备展示窗体的功能,无法实现生成窗体,所以我们需要在项目中手动增加自定义的Dialog对话框,并对该对话框进行一定的定制。

mdi窗体如何调用子窗体函数

这个Dialog对话框我们只增加两个功能,一个Dialog::currentFileName()获取窗体标题,另一个Dialog::SetData(QString data)设置数据到编辑框,代码实现如下.

34;dialog.h" 34;ui_dialog.h" Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog) { ui->setupUi(this); this->setWindowTitle("New Doc <By: LyShark >"); // 窗口标题 this->setAttribute(Qt::WA_DeleteOnClose); // 关闭时自动删除 this->setFixedSize(200,100); // 设置窗体大小 // this->setWindowIcon(QIcon(":/image/1.ico")); } Dialog::~Dialog() { delete ui; } // 获取窗体标题 // By: LyShark QString Dialog::currentFileName() { QString title = this->windowTitle(); return title; } // 设置编辑框内容 // https://www.cnblogs.com/lyshark void Dialog::SetData(QString data) { ui->lineEdit->setText(data); }

接着我们开始绘制这个程序的主界面,在toolBar中增加相应的菜单栏,并在主窗体中放入mdiArea容器组件。

mdi窗体如何调用子窗体函数

窗体中的顶部菜单栏,我们需要手动定义一下他们所具备的功能名称等。

mdi窗体如何调用子窗体函数

当程序启动后,程序调用MainWindow初始化这个窗体,初始化代码如下:

34;mainwindow.h" 34;ui_mainwindow.h" 34;dialog.h" #include <iostream> #include <QCloseEvent> // 如果直接关闭,则清空所有对话框 // https://www.cnblogs.com/lyshark void MainWindow::closeEvent(QCloseEvent *event) { ui->mdiArea->closeAllSubWindows(); event->accept(); } // By: LyShark 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; }

代码运行效果如下:

mdi窗体如何调用子窗体函数

用户新建窗体执行MainWindow::on_actionOpen_triggered()事件,关闭窗体时则执行MainWindow::on_actionClose_triggered()事件。

// 新建窗体 void MainWindow::on_actionOpen_triggered() { Dialog *formDoc = new Dialog(this); // ui->mdiArea->addSubWindow(formDoc); //文档窗口添加到MDI formDoc->show(); //在单独的窗口中显示 } // 关闭全部 void MainWindow::on_actionClose_triggered() { ui->mdiArea->closeAllSubWindows(); //关闭所有子窗口 }

代码运行效果如下:

mdi窗体如何调用子窗体函数

当用户点击MDI模式时,我们则执行以下代码,将所有已存在的窗体合并为一个类似于TabWidget的窗体组件。

// 转为MID模式 void MainWindow::on_actionMID_triggered(bool checked) { // Tab多页显示模式 if (checked) { ui->mdiArea->setViewMode(QMdiArea::TabbedView); // Tab多页显示模式 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); } }

代码运行效果如下:

mdi窗体如何调用子窗体函数

窗体级联模式则是将窗体并排排列在一起,我们只需要调用ui->mdiArea->cascadeSubWindows();方法即可实现.

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

代码运行效果如下:

mdi窗体如何调用子窗体函数

平铺模式同样使用ui->mdiArea->tileSubWindows();即可实现转换。

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

代码运行效果如下:

mdi窗体如何调用子窗体函数

最后一个功能是主窗体发送数据到子窗体,该功能的实现需要两个函数。

  • on_mdiArea_subWindowActivated 实现设置主窗体名字到自身
  • on_actionSendMsg_triggered 实现主窗体发送消息到子窗体内

// 当子窗体打开时获取到其窗体标题 // By: LyShark void MainWindow::on_mdiArea_subWindowActivated(QMdiSubWindow *arg1) { Q_UNUSED(arg1); // 若子窗口个数为零,则将statusBar置空 if (ui->mdiArea->subWindowList().count()==0) { ui->statusBar->clearMessage(); } else { // 如果不为0则显示主窗口的文件名 Dialog *formDoc=static_cast<Dialog*>(ui->mdiArea->activeSubWindow()->widget()); ui->statusBar->showMessage(formDoc->currentFileName()); } } // 对选中窗体发送数据 // https://www.cnblogs.com/lyshark void MainWindow::on_actionSendMsg_triggered() { // 先获取当前MDI子窗口 Dialog *formDoc; // 如果打开则获取活动窗体 if (ui->mdiArea->subWindowList().count() > 0) { formDoc=(Dialog*)ui->mdiArea->activeSubWindow()->widget(); // 对活动窗体设置数据 formDoc->SetData("hello lyshark"); } }

代码运行效果如下:

mdi窗体如何调用子窗体函数

本文【mdi窗体如何调用子窗体函数】由作者: 乐观锁 提供,本站不拥有所有权,只提供储存服务,如有侵权,联系删除!
本文链接:https://www.cuoshuo.com/blog/4150.html

(0)
上一篇 2023-03-09 08:45:58
下一篇 2023-03-09 08:57:50

相关推荐

  • 内存使用率高会怎么样_内存到底影响什么

    用安卓系统的朋友会经常遇到手机开机后就占用了绝大多数系统内存的尴尬局面。 为了降低手机内存耗费,绞尽脑汁,习惯了是不久就优化一下,清理一下,结束下进程。是否想过一个问题,是我们做的不对还是手机本来就这样挺好呢? 重启了下手机,什么都没开,又优化了下,系统内存使用率还是在50%左右。 内存使用率高原因之一 安装了过多软件,开机自动启动。 很多软件安装后,都会默…

    2023-03-15
    000
  • bak文件恢复AUTOCAD图形 cad打开后出现bak文件

    操作步骤: 1.显示文件扩展名 打开计算机,依次点击“工具→文件夹选项→查看”,然后把“隐藏已知文件类型的扩展名”前面的钩去掉,如下图所示: 2.显示所有文件 点击“确定后”,再按照1中的顺序,找到目录“查看→隐藏文件和文件夹→选显示隐藏的文件、文件夹和驱动器”。 3.找到备份文件(它的位置可以在工具→选项→文件→临时图形文件位置查到),将其重命名为「.DW…

    2023-03-20
    000
  • demo播放器的指令

    CSGO已经在越来越火,越来越多玩家开始登陆5E对战平台不断磨练自己,但想从新手变成高手可不是一蹴而就的,看Demo了解自己在比赛中的表现,从一个旁观者的角度学习其他玩家、职业选手在比赛中的动作以及各种细节都会对每位都十分有帮助,既然看Demo这么重要,小编当然也会手把手教会玩家如何看Demo的方法! 第一步:将DEMO文件放置在以下路径当文件夹中“x(cs…

    2023-03-14
    100
  • 安装dos7.1(纯dos下安装win7)

    在Windows 的DOS状态下可以安装Windows ,插入Windows 光盘后,首先从开始中进入MS-DOS,然后在MS-DOS下输入“G:\Setup.exe”(G为光驱盘符)即可。 如果想从纯DOS下进行安装,可用启动盘启动到DOS状态,安装时首先加载Smartdrv.exe(将Windows 安装光盘或Windows 系统的Windows目录中的…

    2023-03-21
    000
  • 反比例函数图像平移规律(二次函数图像平移规律口诀)

    二次函数图像的平移对于很多刚接触这方面知识的同学而言有些困难。不过仔细研究后其实并没有想象中那么难。在做题之前我们只需要将规律记牢,然后熟练运用即可。 那么二次函数图像的平移有什么规律呢? 这个口诀大家一定要记牢:“左加右减,上加下减” 尤其是在做填空选择题时,熟练运用口诀能为我们节约大量的做题时间。为了更好地让大家掌握这个技巧,我们通过几道例题来实操下。 …

    2023-03-18
    100
  • sql语言具有什么样的功能

    要了解 SQL,我们需要了解 DBMS 的工作原理。DBMS 或数据库管理系统本质上是一种创建和管理数据库的软件。使用 DBMS,程序员可以创建、管理或选择数据。 数据分析优质社群,等你加入哦~ 数据库作为终端用户和应用程序之间的接口,以组织一致的方式访问数据。例如,用户登录 Facebook。 根据用户注册的电子邮件地址和密码,从应用程序到数据库进行 AP…

    2023-03-11
    100
  • linux系统日志在哪个目录

    日志记录了系统每天发生的各种各样的事情,比如监测系统状况、排查系统故障等。你可以通过日志来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。日志的主要功能是审计和监测,还可以实时地监测系统状态,监测和追踪侵入者等。 在RockyLinux8系统里,以下几个日志默认是不存在的,需要安装rsyslog包,命令如下: yum install -y rsyslog…

    2023-03-14
    000
  • 十六进制转十进制小数点后怎么算(十六进制50如何表示)

    进制的转换 1)R进制转十进制:按权展开 二进制转十进制:10100.01 = 1 x 2^4 + 1 x 2^2 + 1 x 2^-2 七进制转十进制:604.01 = 6 x 7^4 + 4 x 7^0 + 1 x 7^-2 说明:小数点前从0开始,小数点后从-1开始; 多少进制转十进制,则底数替换成多少 2)十进制转R进制:短除法 十进制94转二进制 …

    2023-03-20
    000
  • fpga教程书籍(fpga初学者推荐书籍)

    电子信息类专业需要学习的东西太多了,涉及方方面面,任重道远。这里给大家推荐几本书籍。 1、《大话无线通信》 作者:丁奇 对于初学者,目标是整体了解,推荐人民邮电出版社的《大话无线通信》。书不厚,网上也有电子版,看过它之后,再根据自己的兴趣方向主攻其他著作,个人觉得比较合适。 2、《通信新读-从原理到应用》 作者:陈小锋 该书是一本尝试融会贯通介绍通信相关基本…

    2023-03-17
    100
  • java工程师面试一般会问哪些问题,java开发工程师面试题

    前言 2023 跳槽不迷茫,大家可以先收藏再看,后续跳槽都能用上的! Java程序员绝大部分工作的时间都是增删改查,很多人觉得这项工作没什么技术含量,任何一件事情都要站在不同的角度去考虑,对于大部分的java程序员来讲开始前几年就是在为了达成增删改查而努力,大部分的程序员具备这种能力之后就开始相对安逸的状态了,增删改查的功能如果对于简单的工程代码来讲就是比较…

    2023-03-17
    000

发表回复

登录后才能评论
返回顶部
错说博客上线啦!