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

4.5 状态栏

GUI图形用户界面的状态栏一般用来显示当前系统的状态信息以及一些提示信息。Qt主窗口的状态栏可以添加任意的Qt窗口部件(或Qt提供的标准窗口部件或自定义的继承自QWidget的窗口部件)。

同样,以Qt设计器绘制的主窗口为例,为主窗口添加状态栏及其显示窗口部件。

现在为应用程序主窗口创建一个状态栏,主要显示文本编辑器的一些简单的编辑状态。

重新修改主窗口CMainWindow类的头文件mainwindow.h,如下所示。

        // 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;
            QLabel*         label1;
            QLabel*         label2;

            void        iniDockWidget();
            void        iniStatusBar();
        };
        #endif

在头mainwindow.h文件中,添加一行QLabel类的传递声明;声明了两个指向标签QLabel对象的指针label1和label2;声明了状态栏的初始化函数iniStatusBar()。

在CMainWindow类的实现文件mainwindow.cpp中,添加初始化状态栏函数iniStatusBar()的实现。

        void CMainWindow::iniStatusBar()
        {
            QStatusBar* bar = statusBar();
            label1 = new QLabel;
            label1->setMinimumSize(200, 25);
            label1->setFrameShape(QFrame::WinPanel);
            label1->setFrameShadow(QFrame::Sunken);

函数QMainWindow::statusBar()获取应用程序主窗口的状态栏。如果状态栏已经存在,则返回指向主窗口的状态栏的指针;如果状态栏还没有建立,该函数将新建一个状态栏并添加到主窗口上,然后返回新建状态栏的指针。

函数QLabel::setMinimumSize()设置标签的最小尺寸,以便能够有足够的空间显示信息。在这种情况下,标签的大小是不会伸缩的,除非标签确实无法存放需要显示的全部信息。

QLabel::setFrameShape()函数设置标签的形状,该函数继承自QFrame类。QFrame类定义了7种形状:

● QFrame::NoFrame,没有边框,此时QFrame什么也不绘制;

● QFrame::Box,在显示内容周围绘制一个方框;

● QFrame::Panel,绘制一个面板(panel),使得显示内容凸起或凹陷;

● QFrame::StyledPanel,绘制一个方形的面板,但要依赖于目前使用的GUI类型;显示内容凹陷或凸起;

● QFrame::HLine,绘制一条水平线;

● QFrame::VLine,绘制一条垂直线;

● QFrame::WinPanel,绘制一个凸起或凹陷的类似于Windows 95中的方形面板,线宽为两个像素。提供该类型的目的主要是为了实现兼容性。

在此,QLabel::setFrameShape()的参数采用QFrame::WinPanel,它的3D效果比较明显。

函数QLabel::setFrameShadow()设置标签外框的阴影,该函数继承自QFrame类。QFrame类定义了3种阴影模式:

● QFrame::Plain,窗口部件的内容和外框与该窗口部件的父窗口部件处在同一水平(即没有凹凸感、立体感),在没有3D效果的情况下,设置该阴影模式的窗口部件使用画板的前景色绘制;

● QFrame::Raised,窗口部件的边框和内容是凸起的,具有3D效果;

● QFrame::Sunken,窗口部件的边框和内容是凹陷的,具有3D效果。

此处,设置标签label1的显示效果为QFrame::Sunken。注意,函数QLabel::setFrameShadow()的效果要受到QFrame::setFrameShape()函数参数的影响。

接下来,使用同样的方法添加第二个标签QLabel对象label2。

            label2 = new QLabel;
            label2->setMinimumSize(200, 25);
            label2->setFrameShadow(QFrame::Sunken);
            label2->setFrameShape(QFrame::WinPanel);

            bar->addWidget(label1);
            bar->addWidget(label2);
        }

最后,QStatusBar::addWidget()函数将两个标签对象label1和label2添加到主窗口的状态栏中。该函数具有两个形参:第一个参数指定了需要添加的窗口部件;第二个参数指定了一个伸缩因子,当状态栏伸长或压缩的时候,布局管理器用该因子来计算窗口部件的大小,以便使被添加的窗口部件的尺寸适合于新的情况。第二个参数采用默认值0,它表示在窗口部件能够完全显示其内容的前提下,该窗口部件的尺寸是最小的。

在构造函数中添加对函数iniStatusBar()的调用。

重新编译、运行应用程序,显示效果如图4-24所示。

图4-24 加入状态条后的主窗口界面