描述
QMdiArea
小部件提供了一个区域,用于显示MDI窗口。QMdiArea
的功能类似于MDI窗口的窗口管理器。例如,它在自身上绘制和排列管理的窗口,可以按级联或平铺模式排列它们。通常,QMdiArea
被用作QMainWindow的中心小部件,用于创建MDI应用程序,但也可以放置在任何布局中。下面的代码向主窗口添加了一个MDI区域:
QMainWindow *mainWindow = new QMainWindow;
mainWindow->setCentralWidget(mdiArea);
与顶级窗口的窗口管理器不同,QMdiArea支持所有窗口标志(Qt::WindowFlags),只要这些标志被当前小部件样式支持。如果某个特定的标志在样式中不受支持(如WindowShadeButtonHint),您仍然可以使用showShaded()来收起窗口。
以上这段话理解就是:
QMdiArea(一个Qt库中的类,用于创建多文档界面(MDI)应用程序的主窗口区域)支持所有的窗口标志(Qt::WindowFlags),但是这些标志是否能被正确使用还取决于当前窗口部件(Widget)的样式是否支持这些标志。有些窗口标志可能在某些样式中不被支持,比如“WindowShadeButtonHint”。“WindowShadeButtonHint”这个窗口标志是用来表示窗口是否有一个按钮可以用来控制窗口的阴影效果的。但是,如果这个标志在当前使用的样式中不被支持,也就是说,即使你设置了这个标志,你可能也看不到相应的阴影按钮。
然而,尽管这个标志在样式中不受支持,你仍然可以使用showShaded()函数来收起(或展开)窗口。也就是说,尽管你可能看不到阴影按钮,但是你仍然可以通过代码来控制窗口的阴影效果。
总的来说,这句话是在说明QMdiArea的窗口标志支持和样式的关系,以及当某些标志不被样式支持时的处理方式。
在QMdiArea
中,子窗口是QMdiSubWindow
的实例。可以使用addSubWindow()
将它们添加到MDI区域中。通常,会将一个QWidget
作为内部小部件传递给此函数,但也可以直接传递一个QMdiSubWindow
。此类继承自QWidget
,您可以像处理普通顶级窗口一样使用相同的API进行编程。QMdiSubWindow
还具有特定于MDI窗口的行为。有关更多详细信息,请参阅QMdiSubWindow
类描述。
当子窗口获得键盘焦点或调用setFocus()
时,它将变为活动窗口。用户可以通过通常的方法来激活窗口。当活动窗口更改时,MDI区域会发出subWindowActivated()
信号,activeSubWindow()
函数返回活动子窗口。
方便的函数subWindowList()
返回所有子窗口的列表。例如,这些信息可以用于弹出菜单中包含窗口列表的情况。
子窗口按当前的窗口顺序进行排序。这用于subWindowList()
以及activateNextSubWindow()
和activatePreviousSubWindow()
,也用于使用cascadeSubWindows()
和tileSubWindows()
级联或平铺窗口的情况。
QMdiArea
提供了两种内置的子窗口布局策略:cascadeSubWindows()
和tileSubWindows()
。它们都是槽函数,并且可以轻松地连接到菜单项。
常用函数
以下是QMdiArea的常用函数、信号和槽的介绍:
成员函数
-
addSubWindow(QWidget *widget, Qt::WindowFlags flags = Qt::EmptyFlag)
:将一个QWidget添加为子窗口,并返回对应的QMdiSubWindow实例。 -
removeSubWindow(QWidget *widget)
:从MDI区域中移除指定的子窗口。 -
setActiveSubWindow(QMdiSubWindow *window)
:将指定的QMdiSubWindow设置为活动窗口。 -
cascadeSubWindows()
:级联排列所有子窗口。 -
tileSubWindows()
:平铺排列所有子窗口。 -
subWindowList()
:返回包含所有子窗口的列表。 -
activeSubWindow()
:返回当前活动的子窗口。
信号
-
subWindowActivated(QMdiSubWindow *window)
:当活动窗口发生变化时触发该信号,参数为当前活动的子窗口。 -
subWindowActivated(QWidget *window)
:重载版本的subWindowActivated信号,参数为当前活动的子窗口的内部小部件。 -
subWindowAboutToActivate(QMdiSubWindow *window)
:在即将激活子窗口之前触发该信号,参数为即将激活的子窗口。 -
subWindowAboutToActivate(QWidget *window)
:重载版本的subWindowAboutToActivate信号,参数为即将激活的子窗口的内部小部件。
槽
-
cascadeSubWindows()
:槽函数,用于级联排列所有子窗口。 -
tileSubWindows()
:槽函数,用于平铺排列所有子窗口。 -
activateNextSubWindow()
:槽函数,激活下一个子窗口。 -
activatePreviousSubWindow()
:槽函数,激活上一个子窗口。
除了上述函数、信号和槽之外,QMdiArea还具有一些其他函数用于设置和查询MDI区域的属性,例如设置背景颜色、设置视图模式、获取焦点子窗口等。可以参考Qt官方文档中的QMdiArea类文档以获取更详细的信息和完整的函数、信号和槽列表。
示例
以下示例,实现使用QMdiArea实现添加子窗口、删除子窗口、设置背景样式和平铺子窗口等功能:
#include <QtWidgets>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QMainWindow mainWindow;
QMdiArea mdiArea;
mainWindow.setCentralWidget(&mdiArea);
// 设置背景样式
mdiArea.setStyleSheet("background-color: #e9e9e9;");
// 添加子窗口
QWidget *subWindow1 = new QWidget;
subWindow1->setWindowTitle("SubWindow 1");
QLabel *label1 = new QLabel("This is SubWindow 1");
label1->setAlignment(Qt::AlignCenter);
QVBoxLayout *layout1 = new QVBoxLayout(subWindow1);
layout1->addWidget(label1);
mdiArea.addSubWindow(subWindow1);
QWidget *subWindow2 = new QWidget;
subWindow2->setWindowTitle("SubWindow 2");
QLabel *label2 = new QLabel("This is SubWindow 2");
label2->setAlignment(Qt::AlignCenter);
QVBoxLayout *layout2 = new QVBoxLayout(subWindow2);
layout2->addWidget(label2);
mdiArea.addSubWindow(subWindow2);
// 显示主窗口和子窗口
mainWindow.show();
// 平铺子窗口
mdiArea.tileSubWindows();
// 删除子窗口
mdiArea.removeSubWindow(subWindow1);
return app.exec();
}
在示例中,使用QMdiArea来创建一个MDI区域,并将其设置为主窗口的中心小部件。通过设置QMdiArea的样式表来定制背景样式。然后,使用QWidget来创建两个子窗口,并将它们添加到MDI区域中使用addSubWindow()函数。最后,调用tileSubWindows()函数来平铺子窗口,并在需要时使用removeSubWindow()函数来删除子窗口。