4.4 锚接部件
锚接部件QDockWidget继承自Qt的基础窗口部件QWidget,它可以作为QMainWindow的一个窗口部件停靠在应用程序主窗口的内部(上下左右四个位置都可以,见应用程序主窗口的布局框架),也可以作为一个独立的窗口浮动在应用程序主窗口的上面。它经常被作为工具面板或工具窗口来使用。比如,Qt设计器中的对象监视器、属性编辑器以及动作编辑器等都是以锚接部件的形式存在的。
锚接部件QDockWidget为设计应用程序主窗口界面提供了更加灵活方便、易用直观的操作模式。
目前,Qt设计器对锚接部件的支持不是很理想。比如,当通过Qt设计器为主窗口添加一个锚接部件后,运行应用程序,锚接部件能够浮动起来,但不能像窗口一样进行拖动。通过使用代码添加的锚接部件是没有这些问题的。同样,在Qt设计器中也无法编辑主窗口的状态栏,为状态栏添加相应的窗口部件。
在简单文本编辑器例子中,我们通过手写代码添加主窗口的锚接部件(及其子窗口部件)和状态栏的显示窗口部件。下面把第3章设计的查找文件窗口部件加入到锚接部件容器中,在简单文本编辑器中实现对文件的查找。
以Qt设计器绘制的主窗口为例,为主窗口添加锚接部件。在代码创建的主窗口界面中实现锚接部件的添加是相同的。
首先,将第3章中设计的CFindFileForm类的头文件findfileform.h、实现文件findfileform.cpp和ui文件findfileform.ui加入到当前的KDevelop工程中来。有两种方法:
● 将这些文件复制到当前工程的src目录下,然后修改qmake工程文件;
● 在KDevelop的“QMake管理器”选项卡中,在相应的“HEADERS”、“SOURCES”和“FORMS”选项上单击鼠标右键,在出现的对话框中选择需要添加的文件。对话框中最下面的下拉框选择“复制文件”选项,如图4-22所示。
图4-22 将以存在的文件加入当前工程
修改主窗口类CMainWindow的头文件,添加指向锚接部件对象的指针和初始化函数。代码如下所示。
// chapter04/designmainwindow/src/mainwindow.h. #ifndef _MAINWINDOW_H_ #define _MAINWINDOW_H_ #include "ui_mainwindow.h" class QLabel; class CMainWindow : public QMainWindow, public Ui::MainWindow { Q_OBJECT public: CMainWindow(QWidget* = 0); private: QDockWidget* dockWidget; void iniDockWidget(); }; #endif
修改主窗口类的实现文件mainwindow.cpp,将类CFindFileForm的头文件包含进来。修改主窗口类的构造函数,添加对锚接部件初始化函数iniDockWidget()的调用。
锚接部件初始化函数如下所示。
// chapter04/designmainwindow/src/mainwindow.cpp. void CMainWindow::iniDockWidget() { CFindFileForm* findFileForm = new CFindFileForm; dockWidget = new QDockWidget(tr("查找文件"), this); dockWidget->setAllowedAreas(Qt::RightDockWidgetArea); dockWidget->setFeatures(QDockWidget::AllDockWidgetFeatures); dockWidget->setFloating(false); dockWidget->setWidget(findFileForm); dockWidget->setVisible(true); addDockWidget(Qt::RightDockWidgetArea, dockWidget); }
在函数iniDockWidget()函数中,首先构造CFindFileForm对象和锚接部件对象。QDockWidget::setAllowedAreas()函数设置锚接部件在主窗口中可以停靠的位置,它的参数是一个Qt::DockWidgetAreas枚举类型的值(具体含义与Qt::ToolBarAreas的枚举值类似):
● Qt::LeftDockWidgetArea,主窗口的左侧;
● Qt::RightDockWidgetArea,主窗口的右侧;
● Qt::TopDockWidgetArea,主窗口的顶部;
● Qt::BottomDockWidgetArea,主窗口的底部;
● Qt::AllDockWidgetAreas,主窗口的任何一个方位;
● Qt::NoDockWidgetArea,不在任何一个位置。
函数QDockWidget::setFloating()设置锚接部件初始显示的时候是否要浮动在主窗口的上面。在此,传递了一个false参数,即锚接部件第一次显示的时候将停靠在主窗口中。
然后,将查找文件窗口部件放置到锚接部件中,并设置锚接部件为可见的。
最后,函数QMainWindow::addDockWidget()将锚接部件加入到应用程序主窗口中。
OK,现在编译运行应用程序。显示效果如图4-23所示。
图4-23 加入锚接部件后的主窗口界面
在主窗口中,当单击查找文件窗口部件的“关闭”按钮时,查找文件窗口部件会被关闭掉,而锚接部件仍然可见,只是一个空的容器而已。这不是我们想要的运行效果。作为一个锚接部件例子,目前已经详细说明了QDockWidget的使用,如果读者感兴趣的话,可以进一步完善这个功能。