8.5 中心窗口部件专题

从前面的例子中我们可以看到,Qt 程序中的主窗口通常具有一个中心窗口部件。从理 论上来讲,任何继承自 QWidget 的类的派生类的实例,都可以作为中心窗口部件使用。

8.5.1 几种常见情形

QMainWindow 的中心区域可以被任意种类的窗口部件所占用。下面给出的是所有可能情 形的概述。

1. 使用标准的 Qt 窗口部件(Standard Widget)

像 QWidget、Qlabel 以及 QTextEdit 等等这样的标准窗口部件都可以用作中心窗口部 件。

2. 使用自定义窗口部件(User-Define-Widget)

有时候,某些有特殊要求的应用程序需要在自定义窗口部件中显示数据,你可以把自 定义的窗口部件作为中心窗口部件。例如,你的绘图编辑器程序程序就可以使用类似名为 PhotoEditor的自定义窗口部件作为自己的中心窗口部件。

3. 使用一个带布局管理器的普通 Widget 有时候,应用程序的中央区域会被许多窗口部件所占用。这时就可以通过使用一个作为所有这些其他窗口部件父对象的 QWidget,以及通过使用布局管理器管理这些子窗口部件的大小和位置来完成这一特殊情况。

4. 使用切分窗口(QSplitter) 其实,这种情况是上一种情况的一个例子。多个窗口部件一起使用的另一种方法是使用 QSplitter。我们把 QSplitter 作为一个容器,在其中容纳其它的窗口部件,这时的中心窗口部件就是一个 QSplitter。QSplitter 会在水平方向或者竖直方向上排列它的子窗口部 件,用户可以利用切分条(splitter handle)控制他们的尺寸大小。切分窗口可以包含所 有类型的窗口部件,包括其他切分窗口。

5. 使用多文档界面工作空间(QMdiArea) 如果应用程序使用的是多文档界面,那么它的中心区域就会被 QMdiArea 窗口部件所占据,并且每个多文档界面窗口都是它的一个子窗口界面。 QMdiArea 是在 Qt4.3 以后引入的一个支持多文档应用的类。

6. 使用工作空间部件(QWorkspace) 这种情况通常用于多文档应用程序中,这时应用程序主窗口的中心部件是一个 QWorkspace 部件或者它的子类化部件。但这种方法在 Qt4.5 以后将被废弃。后面我们还会讲到它。

8.5.2 创建和使用

一个 Qt 主窗口应用程序必须有一个中心窗口部件 (Central Widget)。当你采用 Qt Designer 创建主窗口时,默认情况下,系统已经为你创建了一个中心窗口部件,它是子类 化 QWidget 的。

结合代码可以方便的设置中心窗口部件,可以调用主窗口类的 setCentralWidget()方 法,它的原型如下:

void QMainWindow::setCentralWidget ( QWidget * widget )

它将把 widget 设置为主窗口的中心窗口部件。

创建中心窗口部件完整的代码示例如下:

QTextEdit * text;
text = new QTextEdit(this); setCentralWidget(text);

Qt 应用程序的主窗口管理着中心窗口部件,它会在合适的时候销毁这个中心窗口部 件。每次程序调用 setCentralWidget()方法时,先前存在的中心窗口部件将被新的所替 换,而且主窗口会销毁原来的部件,无需用户处理。

要想在程序中获得并使用、设置中心窗口部件也很简单,通过调用主窗口类的 centralWidget()方法即可实现,它的函数原型如下:

QWidget * QMainWindow::centralWidget () const

它将返回主窗口的中心窗口部件,如果中心窗口部件不存在,它将返回 0。一个完整的 示例代码如下:

QTextEdit * text = centralWidget();
//设置属性,但通常不需要
...