服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C/C++ Qt MdiArea 多窗体组件应用教程

C/C++ Qt MdiArea 多窗体组件应用教程

2022-03-08 15:13Lyshark C/C++

MDI窗体控件类似于画布,该控件只具备展示窗体的功能,无法实现生成窗体,所以我们需要在项目中手动增加自定义的Dialog对话框,并对该对话框进行一定的定制,这篇文章主要介绍了C/C++ Qt MdiArea 多窗体组件应用,需要的朋友可以

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

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

C/C++ Qt MdiArea 多窗体组件应用教程

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

#include "dialog.h"
#include "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  return title;
}

// 设置编辑框内容
// https://www.cnblogs.com/lyshark
void Dialog::SetData(QString data)
{
  ui->lineEdit->setText(data);
}

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

C/C++ Qt MdiArea 多窗体组件应用教程

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

C/C++ Qt MdiArea 多窗体组件应用教程

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

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "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;
}

代码运行效果如下:

C/C++ Qt MdiArea 多窗体组件应用教程

用户新建窗体执行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(); //关闭所有子窗口
}

代码运行效果如下:

C/C++ Qt MdiArea 多窗体组件应用教程

当用户点击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);
  }
}

代码运行效果如下:

C/C++ Qt MdiArea 多窗体组件应用教程

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

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

代码运行效果如下:

C/C++ Qt MdiArea 多窗体组件应用教程

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

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

代码运行效果如下:

C/C++ Qt MdiArea 多窗体组件应用教程

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

  • 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");
  }
}

代码运行效果如下:

C/C++ Qt MdiArea 多窗体组件应用教程

文章出处:https://www.cnblogs.com/lyshark
版权声明: 本博客文章与代码均为学习时整理的笔记,博客中除去明确标注有参考文献的文章,其他文章 [均为原创] 作品,转载请 [添加出处] ,您添加出处是我创作的动力!

博主警告:如果您恶意转载本人文章,则您的整站文章,将会变为我的原创作品,请相互尊重!

到此这篇关于C/C++ Qt MdiArea 多窗体组件应用的文章就介绍到这了,更多相关C++ Qt MdiArea 多窗体组件内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/LyShark/p/15624618.html

延伸 · 阅读

精彩推荐
  • C/C++C++之重载 重定义与重写用法详解

    C++之重载 重定义与重写用法详解

    这篇文章主要介绍了C++之重载 重定义与重写用法详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    青山的青6062022-01-04
  • C/C++学习C++编程的必备软件

    学习C++编程的必备软件

    本文给大家分享的是作者在学习使用C++进行编程的时候所用到的一些常用的软件,这里推荐给大家...

    谢恩铭10102021-05-08
  • C/C++深入理解goto语句的替代实现方式分析

    深入理解goto语句的替代实现方式分析

    本篇文章是对goto语句的替代实现方式进行了详细的分析介绍,需要的朋友参考下...

    C语言教程网7342020-12-03
  • C/C++C语言中炫酷的文件操作实例详解

    C语言中炫酷的文件操作实例详解

    内存中的数据都是暂时的,当程序结束时,它们都将丢失,为了永久性的保存大量的数据,C语言提供了对文件的操作,这篇文章主要给大家介绍了关于C语言中文件...

    针眼_6702022-01-24
  • C/C++C语言实现电脑关机程序

    C语言实现电脑关机程序

    这篇文章主要为大家详细介绍了C语言实现电脑关机程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    xiaocaidayong8482021-08-20
  • C/C++详解c语言中的 strcpy和strncpy字符串函数使用

    详解c语言中的 strcpy和strncpy字符串函数使用

    strcpy 和strcnpy函数是字符串复制函数。接下来通过本文给大家介绍c语言中的strcpy和strncpy字符串函数使用,感兴趣的朋友跟随小编要求看看吧...

    spring-go5642021-07-02
  • C/C++c++ 单线程实现同时监听多个端口

    c++ 单线程实现同时监听多个端口

    这篇文章主要介绍了c++ 单线程实现同时监听多个端口的方法,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下...

    源之缘11542021-10-27
  • C/C++C/C++经典实例之模拟计算器示例代码

    C/C++经典实例之模拟计算器示例代码

    最近在看到的一个需求,本以为比较简单,但花了不少时间,所以下面这篇文章主要给大家介绍了关于C/C++经典实例之模拟计算器的相关资料,文中通过示...

    jia150610152021-06-07