Qt MDI Window开发


版本说明

版本 作者 日期 备注
0.1 loon 2018.11.2 初稿

目录

文章目录

  • Qt MDI Window开发
    • 版本说明
    • 目录
    • 一、需求分析
    • 二、什么是MDI Window
    • 三、MDI相关Qt类介绍
      • 1、QMdiArea
      • 2、QMdiSubWindow
    • 四、Qt MDI Example
    • 五、最后

一、需求分析

我们需要做一个类似下面结构的配置软件,分析其基本结构,发现我们需要MDI Window作为主体UI框架,所以,我们需要了解Qt MDI Window应用编程。

二、什么是MDI Window

MDI,是Multiple Document Interface的缩写,即多文档接口,在VC++开发时,如果使用MFC,则创建工程时,一般会引导用户去选择单文档窗体还是多文档窗体。MDI是微软为开发人员提供的用来创建同时操作多个文档的编程接口。所谓Document相当于一个线程,它在属于自己的空间中,处理特定的事务。用户可以查看或者完成数字报表制作、文本编辑或者画图等操作,仅仅通过简单的移动鼠标从一个空间到另一个空间。 一个MDI应用类似于Windows桌面接口,都包含多个视图,也就是我们在MFC中常说的View。但是,与Windows桌面接口不一样的是,MDI的视图空间仅限于本应用之内。 MDI广泛应用于多个窗体间传值,同时查看相同数据的不同表现形式,再一个浏览器中同时打开多个网页等方面。总之,多文档接口多应用在需要同时处理多个事务的情形。其实,类似于我们常说的并行计算,只是不同的表现形式罢了!

MDI应用程序至少要由两个截然不同的窗口组成。第一个窗口叫做MDI容器(Container),可以在容器中显示的窗口叫做MDI子窗口。

Qt也支持MDI Window,直接搜索MDI就可以找到相关的内容,包括QMdiArea和QMdiSubWindow,其中QMdiArea就是MDI容器,QMdiSubWindow就是MDI子窗口。

三、MDI相关Qt类介绍

上面已经说过,Qt的MDI编程包括QMdiArea和QMdiSubWindow两大类,QMdiArea提供容器,QMdiSubWindow提供子窗口。QMdiArea编程源自Qt 4.4,所以必须是Qt4.4以上才能用。

直接在帮助手册上搜索MDI,可以查到相关的内容:

1、QMdiArea

QMdiArea小部件提供了显示MDI窗口的区域。

QMdiArea函数本质上类似于MDI窗口的窗口管理器。例如,它绘制它自己管理的窗口,并以级联或平铺模式排列它们。QMdiArea通常用作QMainWindow中的中心小部件,用于创建MDI应用程序,但也可以放在任何布局中。以下代码向主窗口添加了一个区域:

     QMainWindow *mainWindow = new QMainWindow;mainWindow->setCentralWidget(mdiArea);

与顶级窗口的窗口管理器不同,所有窗口标志(Qt::WindowFlags)都由QMdiArea支持,只要这些标志由当前小部件样式支持。如果样式不支持特定的标志(例如,WindowShadeButtonHint),仍然可以使用showshade()对窗口进行阴影处理。

QMdiArea中的子窗口是QMdiSubWindow的实例。它们被添加到带有addSubWindow()的MDI区域。将设置为内部小部件的QWidget传递给此函数是很常见的,但是也可以直接传递QMdiSubWindow。类继承QWidget,您可以在编程时使用与普通顶级窗口相同的API。QMdiSubWindow还有特定于MDI窗口的行为。有关详细信息,请参阅QMdiSubWindow类描述。

子窗口在获得键盘焦点或调用setFocus()时变为活动状态。用户以通常的方式移动焦点来激活窗口。MDI区域在活动窗口更改时发出子窗口激活()信号,而activeSubWindow()函数返回活动子窗口。

便利函数subWindowList()返回所有子窗口的列表。例如,可以在包含窗口列表的弹出菜单中使用此信息。

子窗口按当前窗口顺序排序。这用于子窗口列表()和activateNextSubWindow()和activatePreviousSubWindow()。同样,当用cascadeSubWindows()和tileSubWindows()级联或平铺窗口时,也可以使用它。

QMdiArea为子窗口提供了两种内置布局策略:cascadeSubWindows()和tileSubWindows()。两者都是插槽,很容易连接到菜单项。

注意:QMdiArea的默认滚动条属性是Qt::ScrollBarAlwaysOff。

这上面就是QMdiArea的使用介绍了,具体每个API这里就不多说了,你可以结合给到的MDI示例去看一下如何调用的,然后在例子代码中详细看对应的API功能。

2、QMdiSubWindow

直接搜QMdiSubWindow,可以找到对整个类的描述以及对应的方法和属性。

QMdiSubWindow类为QMdiArea提供了子窗口类。

QMdiSubWindow表示QMdiArea中的顶级窗口,由带有窗口装饰的标题栏、内部小部件和(取决于当前样式)窗框和大小手柄组成。QMdiSubWindow有自己的布局,它由标题栏和内部小部件的中心区域组成。

构造QMdiSubWindow最常见的方法是调用QMdiArea::addSubWindow(),内部小部件作为参数。您还可以自己创建子窗口,并通过调用setWidget()设置内部小部件。

在对子窗口进行编程时,可以使用与普通顶级窗口相同的API(例如,可以调用show()、hide()、showMaximized()和setWindowTitle()等函数)。

QMdiSubWindow还支持MDI区域中特定于子窗口的行为。

默认情况下,每一个QMdiSubWindow在MDI区域视图中都是可见的,但是也可以指定透明窗口移动和调整大小的行为,在这些操作中,只有子窗口的轮廓被更新。setOption()函数用于启用此行为。

isShaded()函数的作用是:检测子窗口当前是否被着色。(也就是说,窗口被折叠,因此只有标题栏是可见的)。要进入阴影模式,请调用showshade()。QMdiSubWindow在窗口状态发生变化时发出windowStateChanged()信号(例如,当窗口最小化或恢复时)。它还会在被激活之前发出aboutToActivate()。

在键盘交互模式下,窗口通过键盘移动和调整大小。您可以通过窗口的系统菜单进入该模式。keyboardSingleStep和keyboardPageStep属性控制小部件为每个按键事件移动或调整大小的距离。当按下shift键时,使用页步;否则使用单步。

您还可以使用键盘更改活动窗口。通过同时按下control和tab键,下一个(使用当前的WindowOrder)子窗口将被激活。通过按下control、shift和tab,您将激活前一个窗口。这相当于调用activateNextSubWindow()和activatePreviousSubWindow()。注意,这些快捷方式会覆盖全局快捷方式,但不会覆盖QMdiAreas快捷方式。

具体的API就不一一说明了,下面我们看一下Qt自带的例子。

四、Qt MDI Example

直接在示例中搜索MDI,找到对应的示例,然后配置并编译,结果如下(我打开了两个窗口,并且让它们平铺):

接着,我们还是在帮助手册中找到MDI Example:

可以看到该例子包含的文件和图片资源。

说明中只是把代码贴进来了,并没有具体说明,但是我们还是按照之前的形式看划分:mainwindow、mdichild、main、mdi这几大部分,然后再看一下pro中需要添加什么,qrc如何添加资源文件的。maindow中提供对应的工具栏功能,mdichild中则将工具栏需要的功能在对应子窗口中实现,层次还是很清晰的。在mainwindow的构造、newFile、析构等方法中体现了Qt MDI编程时API的调用,并不难。

五、最后

基础的使用并不难,主要是在这个基础上实现我们需要的功能,比如如何将两个窗口中的数据进行关联互用,除了平铺上下排布,是否可以垂直布局等等,我们可以在此基础上灵活的处理。

Qt MDI Window开发相关推荐

  1. Qt移动应用开发(八):实现跨平台的QML和OpenGL混合渲染

    Qt移动应用开发(八):实现跨平台的QML和OpenGL混合渲染 上一篇文章讲到了利用C++这个桥梁,我们实现了QML和Java的交互.Qt 5大力推崇的QML/JS开发,让轻量.高速开发的QML/J ...

  2. qt for android开发百度地图(一步步带图详解)

    qt for android开发百度地图 前言:qt for android开发百度地图,其实找了很多资料,基本上没有,就自己折磨弄了出来,这个过程还是很曲折的,折磨了一两个星期,没有资料,就两个字' ...

  3. QT for symbian 开发环境安装

    Qt for Symbian 的开发环境主要由三部分组成:基本工具;Symbian SDK;Qt for Symbian SDK.请依序安装. 注意1: 如果在Nokia 论坛上下载开发工具,你需要你 ...

  4. 【Qt编程】基于Qt的词典开发系列六--界面美化设计

    本文讲一讲界面设计,作品要面向用户,界面设计的好坏直接影响到用户的体验.现在的窗口设计基本都是扁平化的,你可以从window XP与window 8的窗口可以明显感觉出来.当然除了窗口本身的效果,窗口 ...

  5. Qt vlc视频开发libvlc_new返回空的问题

    转自:http://www.cppblog.com/seahouse/archive/2013/09/26/196519.html Qt vlc视频开发libvlc_new返回空的问题 Windows ...

  6. Halcon学习笔记(一):Qt+Halcon联合开发配置

    Halcon学习笔记(1):Qt+Halcon联合开发配置 首先是新建一个QT项目qtest_hc 方法一: 1)QT项目文件 qtest_hc 添加库: #1.包含目录添加 INCLUDEPATH ...

  7. Qt for Android 开发大坑

    Qt for Android 开发大坑 作者: qyvlik Qt 5.5.1 这里说一说比較常见的 Qt 开发安卓的大坑. 希望同学们不要做无谓的挣扎,跳过这些坑. 输入框 首当其冲的是输入框,Qt ...

  8. linux上 arm开发环境搭建,详解 LINUX下QT For ARM开发环境搭建过程

    LINUX下QT For ARM开发环境搭建过程是本文介绍的内容,不多说,先来看内容.在PC上,我们需要得到两个版本的Qt,分别是:Qt-4.5.2和QtEmbedded-4.5.2-arm.前者包括 ...

  9. qt creator php扩展,用qt creator搭建开发、调试php扩展的环境

    用qt creator搭建开发.调试php扩展的环境 用qt creator搭建开发.调试php扩展的环境 https://segmentfault.com/a/1190000009828172 目标 ...

  10. 基于Qt ffmpeg opengl开发跨平台安卓实时投屏软件

    [开源]基于Qt ffmpeg opengl开发跨平台安卓实时投屏软件 码云地址 https://gitee.com/Barryda/QtScrcpy github地址 https://github. ...

最新文章

  1. 如何使用pyecharts中自带的数据集?
  2. STM32与DS1302的接口电路
  3. Haproxy + Pacemaker 实现高可用负载均衡(二)
  4. 简述SAS逻辑库的概念及建立方法。什么是临时库和永久库?
  5. python3所支持的整数进制_Python3快速入门(三)——Python3标准数据类型
  6. mysql 删除另一个表中的_mysql – 在一个查询SQL中删除两个表中的记录
  7. 华为手机 APP被杀_华为手机服务APP将全新改版 三大升级体验更加出色
  8. [论文摘录] Web Service QoS的几个研究方向
  9. linux刷新profile文件,Linux下修改.bash_profile 文件改变PATH变量的值
  10. Python、Lua和Ruby——脚本大P.K.
  11. Java中Dom解析xml文档
  12. numpy和pandas官方文档中文版分享
  13. 中国指定银行支行数据及省市数据获取
  14. detours钩子库的简单使用
  15. 图像处理/opencv/C++:图像马赛克
  16. 网络安全入门学习资源汇总
  17. U3D游戏开发框架(三)——UI管理器
  18. windows方法和属性
  19. heka 输出到mysql_让Heka支持lua的io操作和os操作
  20. linux mint必装软件,Linux mint 系统实用软件推荐和安装

热门文章

  1. html超链接能post吗,通过html超链接进行POST
  2. 使用google翻译免费翻译文档,这里以pdf为例
  3. 【股票融资融券模拟交易系统】开发与设计
  4. 一边裁员、一边招聘,领导到底想干啥?
  5. 计算机基础到底是哪些基础?为什么很重要!
  6. NOIP 模拟题 小G的城堡
  7. GHOSTXP_SP3电脑公司装机特别版 V30.0[NTFS]
  8. 【CSDN雇主招聘】深信服科技带着高薪岗位JD和公司周边来啦
  9. 如何将多个图片合成一个pdf
  10. android qq 文件怎么打开,如何更改腾讯QQ手机版默认的文件打开方式