1、QMdiArea类
#include
2、叠或者平铺的方式排列它们。 下面的代码将一个区域的主窗口: QMainWindow *mainWindow = new QMainWindow; mainWindow->setCentralWidget(mdiArea); 有别于窗口管理器的顶层窗口,QMdiArea支持所有窗口的标志(QT:: WindowFlags),只要标志被当前窗口风格所支持。如果一个特定的标志不支持该窗口的风格(如WindowShadeButtonHint),你仍然可以使用showShaded()来隐藏窗口风格。 QMdiArea和QMdiSubWindow,前者主要用于创建程序主窗口的中心窗口部件,后者用
3、于创建主窗口的各个子窗口。具体的做法是把 QMdiArea类的实例作为主窗口的中心部件,把QMdiSubWindow类的实例作为子窗口,并由QMdiArea实现对多个子窗口的管理。 QMdiSubWindow继承自QWidget,它的作用是为QMdiArea创建子窗口。它代表了在QMdiArea中创建的顶层窗口。它主要包含一个标题栏、一个内部窗口(Internal Widget)、一个窗口框架和一个大小控制手柄。QMdiSubWindow有自己的布局(Layout),在其中包含窗口标题栏以及内部窗口的中心窗口区域。 QMdiArea是所有子窗口的容器和管理器,QMdiArea中的子窗口都是
4、QMdiSubWindow类的实例。我们通过addSubWindow()方法把它们加入到MDI应用程序中。使用时,通常先建立一个QWidget或其子类的实例,然后把它作为参数调用addSubWindow()函数,addSubWindow()函数将把它作为子窗口的内部窗口,并填充中心窗口区域。由于QMdiSubWindow是QWidget的子类,所以你可以像使用以前我们介绍过的常见顶层窗口那样使用它,如可以调用基类QWidget的show(), hide(), showMaximized(), 以及setWindowTitle()等方法对窗口实例进行设置。 小贴士:为QMdiSubWind
5、ow创建内部窗口有两种方法,一种是调用addSubWindow(widget),其中widget参数将作为内部窗口部件;另一种是先创建一个继承自QWidget的窗口实例,然后调用setWidget(QWidget*widget)方法,把widget作为子窗口的内部窗口部件即可,这个内部窗口部件将被显示在子窗口的中心区域。注意,QMdiArea会对其内部的子窗口进行管理,你不必使用代码显式的管理它们。 新建一个子窗口类,它可派生自QWidget或其子类,比如QTextEdit。这个类的实例将作为子窗口的内部窗口部件。这个子窗口类的创建与我们前面讲到的子类化对话框和子类化QWidget的方法相同
6、只是它没有菜单栏、工具栏和状态栏。另外记得在主窗口的头文件中加入该子窗口类的声明。 注意:QMdiArea默认的滚动条属性是Qt:: ScrollBarAlwaysOff。 2、成员类型文档 enum QMdiArea::AreaOption flags QMdiArea::AreaOptions 这个枚举描述选项定制QMdiArea的行为。 QMdiArea::DontMaximizeSubWindowOnActivation 0x1 当活动的子窗口最大化时,默认的行为是被激活的下一个子窗口也被最大化。如果你不希望出现此行为,设置这个选项。 enum QMdiArea::
7、ViewMode 这个枚举变量描述了区域的视图模式;即子窗口将被如何显示。 QMdiArea::SubWindowView 0 显示带有窗框的子窗口(默认) QMdiArea::TabbedView 1 只显示标签栏的子窗口 enum QMdiArea::WindowOrder 指定标准用于返回按subWindowList()排序的子窗口列表。函数cascadeSubWindows()和tileSubWindows()安排窗口时遵循这个顺序。 QMdiArea::CreationOrder 0 窗口按照其创建的顺序返回 QMdiArea::StackingOrder
8、 1 窗口按照它们被叠放的顺序返回,最顶层的窗口在列表的最后 QMdiArea::ActivationHistoryOrder 2 窗口按照其被激活的顺序返回 3、属性文档 activationOrder : WindowOrder 这个属性保存标准排序的子窗口列表。 此属性指定标准排序将使用在由subWindowList()返回的子窗口的列表中。默认情况下,它是窗口创建顺序。 background : QBrush 这个属性保存的工作区的背景。 此属性为工作区设置背景。默认情况下,它是一个灰色的颜色,但也可以是任意(如:颜色,渐变或像素映射)。 documentMo
9、de : bool 这个属性保存的标签栏在选项卡式视图模式是否设置为文件的模式 文档模式默认情况下禁用。 tabPosition : QTabWidget::TabPosition (当viewMode是TabbedView时)设置标签所在方向 此属性的可能值由QTabWidget:: TabPosition枚举描述 tabShape : QTabWidget::TabShape 这个属性保存在索引视图模式选项卡的形状。 (当viewMode是TabbedView时)设置该MdiArea的标签形式Qt提供两种选择:Rounded(圆,默认)和Triangular(三角形)
10、tabsClosable : bool 这个属性保存签视图模式下每个选项卡上的标签栏是否应该被关闭。 标签是不关闭的默认。 tabsMovable : bool 这个属性保存的是用户是否可以在标签视图模式下TabBar区中移动的标签。 标签是不可移动的默认。 viewMode : ViewMode 这个属性保存在QMdiArea下的子窗口显示的方式。 默认情况下,SubWindowView是用来显示子窗口。 4、成员函数文档 QMdiArea::QMdiArea ( QWidget * parent = 0 ) 构造一个父对象为parent的MdiArea QMd
11、iArea::~QMdiArea () 析构多文档窗口(MDI) void QMdiArea::activateNextSubWindow () [slot] 激活下一个窗口 void QMdiArea::activatePreviousSubWindow () [slot] 激活上一个窗口 QMdiSubWindow * QMdiArea::activeSubWindow () const 返回当前活动子窗口,如果当前没有活动子窗口,则返回0 QMdiSubWindow * QMdiArea::addSubWindow ( QWidget * widget, Qt::Wind
12、owFlags windowFlags = 0 ) 添加一个新的子窗口部件 // internalWidget1和internalWidget2为创建的widget子窗口 QMdiArea mdiArea; QMdiSubWindow *subWindow1 = new QMdiSubWindow; subWindow1->setWidget(internalWidget1); subWindow1->setAttribute(Qt::WA_DeleteOnClose); mdiArea.addSubWindow(subWindo
13、w1); QMdiSubWindow *subWindow2 =mdiArea.addSubWindow(internalWidget2); void QMdiArea::cascadeSubWindows () [slot] 子窗口以层叠模式来放置 void QMdiArea::childEvent ( QChildEvent * childEvent ) [virtual protected] 这个事件处理器在子类中可以被重新实现来接收子对象事件。 当子对象被插入或移除,子对象事件被发送给对象。 void QMdiArea::closeActiveSubWindow
14、 () [slot] 关闭当前活动子窗口 void QMdiArea::closeAllSubWindows () [slot] 关闭所有的子窗口 QMdiSubWindow * QMdiArea::currentSubWindow () const 返回当前活动的子窗口,如果当前没有自窗口,则返回0 bool QMdiArea::event ( QEvent * event ) [virtual protected] 这个虚函数会接收到一个对象的事件并且应该在event被识别和处理时返回真。 bool QMdiArea::eventFilter ( QObject * obj
15、ect, QEvent * event ) [virtual protected] 如果这个对象已经被安装为object对象的一个事件过滤器,就过滤事件。 在这个函数你的重新实现中,如果你想过滤出e事件,比如,停止它的进一步处理,返回真,否则返回假。 QSize QMdiArea::minimumSizeHint () const [virtual] 返回这个多文档窗口部件的建议最小大小。 void QMdiArea::paintEvent ( QPaintEvent * paintEvent ) [virtual protected] 这个事件处理器可以在子类中被重新实现来接收绘
16、制事件。 void QMdiArea::removeSubWindow ( QWidget * widget ) 删除widget,widget必须是该MdiArea的子部件 void QMdiArea::resizeEvent ( QResizeEvent * resizeEvent ) [virtual protected] 这个事件处理器可以在子类中被重新实现来接收多文档窗口部件重定义大小事件。当resizeEvent()被调用时,这个多文档窗口部件已经有了新的几何形状。原来的大小可以通过QResizeEvent::oldSize()访问。这个多文档窗口部件竟被擦除并且在处理重定
17、义大小事件之后立即接收到一个绘制事件。在这个处理器中不需要(或者必须)绘制。 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区内的opti
18、on使能;否则将被禁用。见AreaOption每个option的效果。 void QMdiArea::setupViewport ( QWidget * viewport ) [protected slot] 重新实现这个函数在QMdiArea的子类来初始化新视口之前使用它。 void QMdiArea::showEvent ( QShowEvent * showEvent ) [virtual protected] 这个事件处理器可以在子类中被重新实现来接收多文档工作区部件显示事件。 QSize QMdiArea::sizeHint () const [virtual] 返回建议
19、的多文档工作区大小
void QMdiArea::subWindowActivated ( QMdiSubWindow * window ) [signal]
当window这个窗口被激活时,触发这个信号
QList






