Qt MDI Window开发

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应用编程。

Qt MDI Window开发_第1张图片

二、什么是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,可以查到相关的内容:
Qt MDI Window开发_第2张图片

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,可以找到对整个类的描述以及对应的方法和属性。

Qt MDI Window开发_第3张图片

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,找到对应的示例,然后配置并编译,结果如下(我打开了两个窗口,并且让它们平铺):

Qt MDI Window开发_第4张图片

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

Qt MDI Window开发_第5张图片

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

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

五、最后

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

你可能感兴趣的:(Qt开发,Qt,MDI编程,MDI,Window)