2024年4月28日发(作者:)

QMdiArea类

#include

用于提供多窗口文档(MDI)的显示区域。继承自QAbstractScrollArea类。

来自Qt的官方说法是,QWorkspace是被废弃的类,它的存在就是为了使采用以前版本的

Qt开发的程序能够正常运行。所以,如果你使用的是Qt4.5及以后的版本,我们强烈建议你

使用QMdiArea来创建MDI应用程序。

1、详细描述

在创建MDI应用程序时,QMdiArea类的实例通常被用作主窗口的中心窗口部件,但也可以

被放置于一个布局中。实际上,QMdiArea是MDI应用程序的窗口管理器。它建立、绘制、

管理在它之上的子窗口,并可采用层叠或者平铺的方式排列它们。

下面的代码将一个区域的主窗口:

QMainWindow *mainWindow = new QMainWindow;

mainWindow->setCentralWidget(mdiArea);

有别于窗口管理器的顶层窗口,QMdiArea支持所有窗口的标志(QT:: WindowFlags),只要

标志被当前窗口风格所支持。如果一个特定的标志不支持该窗口的风格(如

WindowShadeButtonHint),你仍然可以使用showShaded()来隐藏窗口风格。

QMdiArea和QMdiSubWindow,前者主要用于创建程序主窗口的中心窗口部件,后者

用于创建主窗口的各个子窗口。具体的做法是把 QMdiArea类的实例作为主窗口的中心部

件,把QMdiSubWindow类的实例作为子窗口,并由QMdiArea实现对多个子窗口的管理。

QMdiSubWindow继承自QWidget,它的作用是为QMdiArea创建子窗口。它代表了在

QMdiArea中创建的顶层窗口。它主要包含一个标题栏、一个内部窗口(Internal Widget)、一

个窗口框架和一个大小控制手柄。QMdiSubWindow有自己的布局(Layout),在其中包含窗口

标题栏以及内部窗口的中心窗口区域。

QMdiArea是所有子窗口的容器和管理器,QMdiArea中的子窗口都是QMdiSubWindow

类的实例。我们通过addSubWindow()方法把它们加入到MDI应用程序中。使用时,通常先

建立一个QWidget或其子类的实例,然后把它作为参数调用addSubWindow()函数,

addSubWindow()函数将把它作为子窗口的内部窗口,并填充中心窗口区域。由于

QMdiSubWindow是QWidget的子类,所以你可以像使用以前我们介绍过的常见顶层窗口那

样使用它,如可以调用基类QWidget的show(), hide(), showMaximized(), 以及

setWindowTitle()等方法对窗口实例进行设置。

小贴士:为QMdiSubWindow创建内部窗口有两种方法,一种是调用

addSubWindow(widget),其中widget参数将作为内部窗口部件;另一种是先创建一个继承自

QWidget的窗口实例,然后调用setWidget(QWidget*widget)方法,把widget作为子窗口的内

部窗口部件即可,这个内部窗口部件将被显示在子窗口的中心区域。注意,QMdiArea会对

其内部的子窗口进行管理,你不必使用代码显式的管理它们。

新建一个子窗口类,它可派生自QWidget或其子类,比如QTextEdit。这个类的实例将

作为子窗口的内部窗口部件。这个子窗口类的创建与我们前面讲到的子类化对话框和子类化

QWidget的方法相同,只是它没有菜单栏、工具栏和状态栏。另外记得在主窗口的头文件中

加入该子窗口类的声明。

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

2、成员类型文档

enum QMdiArea::AreaOption

flags QMdiArea::AreaOptions

这个枚举描述选项定制QMdiArea的行为。

QMdiArea::DontMaximizeSubWindowOnActivation 0x1

当活动的子窗口最大化时,默认的行

为是被激活的下一个子窗口也被最

大化。如果你不希望出现此行为,设

置这个选项。

enum QMdiArea::ViewMode

这个枚举变量描述了区域的视图模式;即子窗口将被如何显示。

QMdiArea::SubWindowView

QMdiArea::TabbedView

enum QMdiArea::WindowOrder

0

1

显示带有窗框的子窗口(默认)

只显示标签栏的子窗口

指定标准用于返回按subWindowList()排序的子窗口列表。函数cascadeSubWindows()和

tileSubWindows()安排窗口时遵循这个顺序。

QMdiArea::CreationOrder

QMdiArea::StackingOrder

0

1

窗口按照其创建的顺序返回

窗口按照它们被叠放的顺序返回,最顶层的窗口在

列表的最后

窗口按照其被激活的顺序返回

QMdiArea::ActivationHistoryOrder 2

3、属性文档

activationOrder : WindowOrder

这个属性保存标准排序的子窗口列表。

此属性指定标准排序将使用在由subWindowList()返回的子窗口的列表中。默认情况下,

它是窗口创建顺序。

background : QBrush

这个属性保存的工作区的背景。

此属性为工作区设置背景。默认情况下,它是一个灰色的颜色,但也可以是任意(如:颜色,

渐变或像素映射)。

documentMode : bool

这个属性保存的标签栏在选项卡式视图模式是否设置为文件的模式

文档模式默认情况下禁用。

tabPosition : QTabWidget::TabPosition

(当viewMode是TabbedView时)设置标签所在方向

此属性的可能值由QTabWidget:: TabPosition枚举描述

tabShape : QTabWidget::TabShape

这个属性保存在索引视图模式选项卡的形状。

(当viewMode是TabbedView时)设置该MdiArea的标签形式Qt提供两种选择:Rounded(圆,

默认)和Triangular(三角形)

tabsClosable : bool

这个属性保存签视图模式下每个选项卡上的标签栏是否应该被关闭。

标签是不关闭的默认。

tabsMovable : bool

这个属性保存的是用户是否可以在标签视图模式下TabBar区中移动的标签。

标签是不可移动的默认。

viewMode : ViewMode

这个属性保存在QMdiArea下的子窗口显示的方式。

默认情况下,SubWindowView是用来显示子窗口。

4、成员函数文档

QMdiArea::QMdiArea ( QWidget * parent = 0 )

构造一个父对象为parent的MdiArea

QMdiArea::~QMdiArea ()

析构多文档窗口(MDI)

void QMdiArea::activateNextSubWindow () [slot]

激活下一个窗口

void QMdiArea::activatePreviousSubWindow () [slot]

激活上一个窗口

QMdiSubWindow * QMdiArea::activeSubWindow () const

返回当前活动子窗口,如果当前没有活动子窗口,则返回0

QMdiSubWindow * QMdiArea::addSubWindow ( QWidget * widget, Qt::WindowFlags windowFlags = 0 )

添加一个新的子窗口部件

// internalWidget1和internalWidget2为创建的widget子窗口

QMdiArea mdiArea;

QMdiSubWindow *subWindow1 = new QMdiSubWindow;

subWindow1->setWidget(internalWidget1);

subWindow1->setAttribute(Qt::WA_DeleteOnClose);

Window(subWindow1);

QMdiSubWindow *subWindow2 =Window(internalWidget2);

void QMdiArea::cascadeSubWindows () [slot]

子窗口以层叠模式来放置

void QMdiArea::childEvent ( QChildEvent * childEvent ) [virtual protected]

这个事件处理器在子类中可以被重新实现来接收子对象事件。

当子对象被插入或移除,子对象事件被发送给对象。

void QMdiArea::closeActiveSubWindow () [slot]

关闭当前活动子窗口

void QMdiArea::closeAllSubWindows () [slot]

关闭所有的子窗口

QMdiSubWindow * QMdiArea::currentSubWindow () const

返回当前活动的子窗口,如果当前没有自窗口,则返回0

bool QMdiArea::event ( QEvent * event ) [virtual protected]

这个虚函数会接收到一个对象的事件并且应该在event被识别和处理时返回真。

bool QMdiArea::eventFilter ( QObject * object, QEvent * event ) [virtual protected]

如果这个对象已经被安装为object对象的一个事件过滤器,就过滤事件。

在这个函数你的重新实现中,如果你想过滤出e事件,比如,停止它的进一步处理,返回真,

否则返回假。

QSize QMdiArea::minimumSizeHint () const [virtual]

返回这个多文档窗口部件的建议最小大小。

void QMdiArea::paintEvent ( QPaintEvent * paintEvent ) [virtual protected]

这个事件处理器可以在子类中被重新实现来接收绘制事件。

void QMdiArea::removeSubWindow ( QWidget * widget )

删除widget,widget必须是该MdiArea的子部件

void QMdiArea::resizeEvent ( QResizeEvent * resizeEvent ) [virtual protected]

这个事件处理器可以在子类中被重新实现来接收多文档窗口部件重定义大小事件。当

resizeEvent()被调用时,这个多文档窗口部件已经有了新的几何形状。原来的大小可以通过

QResizeEvent::oldSize()访问。这个多文档窗口部件竟被擦除并且在处理重定义大小事件之后

立即接收到一个绘制事件。在这个处理器中不需要(或者必须)绘制。

void QMdiArea::scrollContentsBy ( int dx, int dy ) [virtual protected]

移动水平和垂直滑轮dx和dy。

void QMdiArea::setActiveSubWindow ( QMdiSubWindow * window ) [slot]

设置子窗口window为当前活动子窗口

void QMdiArea::setOption ( AreaOption option, bool on = true )

如果是真的,则MDI区内的option使能;否则将被禁用。见AreaOption每个option的效果。

void QMdiArea::setupViewport ( QWidget * viewport ) [protected slot]

重新实现这个函数在QMdiArea的子类来初始化新视口之前使用它。

void QMdiArea::showEvent ( QShowEvent * showEvent ) [virtual protected]

这个事件处理器可以在子类中被重新实现来接收多文档工作区部件显示事件。

QSize QMdiArea::sizeHint () const [virtual]

返回建议的多文档工作区大小

void QMdiArea::subWindowActivated ( QMdiSubWindow * window ) [signal]

当window这个窗口被激活时,触发这个信号

QList QMdiArea::subWindowList ( WindowOrder order = CreationOrder )

const

返回多文档窗口内所有子窗口的列表,排序是按照子窗口创建来排序的

bool QMdiArea::testOption ( AreaOption option ) const

如果启用此选项,则返回true;否则返回false。

void QMdiArea::tileSubWindows () [slot]

子窗口都以平铺方式显示

void QMdiArea::timerEvent ( QTimerEvent * timerEvent ) [virtual protected]

这个信号处理者可以在子类中重新实现而接收对象的定时器事件。

bool QMdiArea::viewportEvent ( QEvent * event ) [virtual protected]

当event事件发生时,返回true