Qt应用程序之Application Main Window详解
下面的类提供了创建典型现代主窗口应用程序的所有事物,例如:主窗口自身,菜单以及工具栏,状态栏等等。
Qt 提供了下面的类用于管理主窗口以及与用户界面关联的组件:
*QmainWindow是构建应用程序主要的类。与接下来的QDockWidget和QToolBar类相比,它代表了应用程序顶级的用户界面。
*QDockWidget提供了用于创建工具面板或者是帮助窗口的组件。Dock widgets保持自己的属性,可以移动,关闭或者是作为外部 窗口浮动。
*QtoolBar提供了通用的工具栏部件,可以保持几个跟动作相关的部件,例如:按钮,菜单等等。它可以与菜单以及键盘很好的合 作。
使用QMainWindow是最直接的方式。一般情况下,我们都会继承自QMainWindow并且在其构造函数中设置菜单,工具栏和菜单栏以及dock widgets部件。
将菜单添加到主窗口中十分简单,只需要创建菜单,将菜单添加到主窗口的菜单栏上。注意,在第一次调用QMainWindow::menuBar()函数在第一次被调用的时候就会创建菜单栏。你也可以调用QMainWindow::setMenuBar()设置自定义的菜单栏。
一旦动作被创建,我们就可以将他们添加到主窗口部件上,首先我们将他们添加到菜单上:
QtoolBar和QMenu类使用了Qt的action系统来提供一致的API。在上面的代码中,我们使用QMenu::addAction()函数将已经存在的actions添加到file菜单中。QToolBar也提供了这个函数,这使得我们可以在主窗口的不同地方重用actions。这就避免了一些不必要的重复的劳动。
我们创建了主创口的工具栏,并且将期望的动作添加上去:在这个示例中,工具栏被限制在主窗口的顶部和底部,并且初始化是放置在主创口的顶部工具栏的。我们可以看到newAct和openAct同时显示在工具栏和file菜单上。
QDockWidget通常以类似QToolBar的方式使用。我们创建一个dockwidget作为主创口的子窗口部件,并且为dock widget添加它自己的子窗口部件。
在这个示例中,dock widget仅仅可以被放置在左边和右边的dock区域,并且初始是放置在左边的dock区域。
QMainWindow API允许程序员将dock widget放置在四个角落的dockwidget区域。如果需要,我们可以使用 QMainWindown::setCorner()函数改变默认情况。
下面的图显示了上面代码展示的配置过程。注意,左边和右边的dockarea包括顶部和底部的拐角。
一旦主窗口的所有组件都被设置起来了,那么我们可以如下创建主窗口并且安装它。中心部件可以是QWidget的任何子类。
【示例】
下载Qt的源代码,可以自行编译这些示例程序,如下是我们自己编译main window示例程序:
下面是运行后的效果,这个程序作为main window示例程序实在是非常好:
1、首先来看一下代码结构和.pro工程文件的内容:
2、分析一下里面包含的一些类
本示例主要包括三个类:ColorSwatch、ToolBar以及MainWindow。
ColorSwatch:继承自QDockWidget,应用程序的dock widget。
ToolBar:继承自QToolBar,应用程序的工具栏。
MainWindow:继承自QMainWindow,应用程序的主窗口。
3、应用程序的启动
4、代码剖析
首先看看MainWIndow的构造函数,其实就是前面介绍到的内容:设置Menu,ToolBar,以及DockWidget:
首先是设置中心窗口为QTextEdit;接着是创建ToolBar(工具栏)
setupToolBar():创建ToolBar对象,添加到主窗口的工具栏中。
setupMenuBar():创建主窗口的菜单项。
setupDockWidgets():用于创建dock widget窗口部件。
以上就是整个mainwindows示例程序的整体结构了,把握住了整体结构再来看代码的细节处理就容易许多了,至于细节部分在此就不罗列了。
最后,我们来看看几个主要的类的实现:ToolBar和ColorSwatch。
。。。。。。。。。。。。。。
1、该构造函数就是根据传入的字符串构建相应的菜单和工具栏,从mainwindow.cpp中我们知道构造了三个工具栏(菜单),菜单的名称是“Tool Bars”。
2 、将 QMenu 的 aboutToShow 信号与自定义的槽函数 updateMenu 关联起来。可以在 Qt Creator 中将光标停留在 QMenu 上,按下 F1 键,就会出现上下文帮助信息,这里来看看 aboutToshow 这个信号在何时发射:aboutToshow信号是在菜单显示之前发射的,也就是初始化的时候使用到。
下面我们主要来看一下与之关联的槽函数updateMenu的实现:
该槽函数首先获取主窗口,然后获取主窗口的工具栏区域,根据主窗口可以将ToolBar放置在哪几个区域来初始化Action(也即对应的菜单项)选中与否。
接下来的就是其它的几个槽函数:ToolBar::order();ToolBar::randomize();ToolBar::addSpinBox();ToolBar::removeSpinBox(),这些槽函数都跟具体的Action关联:
【1】槽函数ToolBar::order()的实现:
该函数的功能是按照一定的顺序排列工具栏中的actions,具体做法就是获取所有的actions之后再按照一定的顺序添加到一个QList<QAction *> ordered列表中,再清除原先的actions,最后再添加具有一定顺序的ordered,具体代码如下:
【2】槽函数ToolBar::randomize()的实现:
该函数的功能是随机的排列工具栏上的actions,具体做法就是先获取所有的actions之后再随机的将这些actions逐一添加到一个QList<QAction *> randomized列表中,再清除原先的actions,最后再添加具有随机顺序的randomized,具体代码如下:
【3】槽函数ToolBar::addSpinBox()的实现:
该函数的功能是判断toolbar上是否已经添加了一个QSpinBox,如果添加了,那么去使能add操作,使能remove操作,添加后的效果如下:
代码实现如下:
【4】槽函数ToolBar::removeSpinBox()的实现:
该函数的功能与上面的相反,判断如果已经添加了一个QSpinBox,则删除,并且使能add操作,去使能remove操作。
代码实现如下:
使用默认析构函数
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
使用默认析构函数