精通Qt4编程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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的使用,如果读者感兴趣的话,可以进一步完善这个功能。