GUI应用程序都有一个主窗口,虽然前面讲到的QWidget组件也可以定义生成主窗口,但是Qt还定义了一个专门用于实现主窗口的类QMainWindow。为什么?跟QDialog一样的道理,主窗口具有许多主窗口特有的元素组件,为了程序的复用性,Qt在QWidget的基础上“特例化”了一个QMainWindow。
GUI程序是由一个主窗口和多个对话框组成,主窗口是与用户进行长时间交互的窗口,是程序启动后显示的第一个窗口,程序的绝大多数功能是直接由主窗口提供,辅助功能由对话框提供。
显然,QMainWindow是一种容器类型的组件。
QMainWindow封装了主窗口常用的菜单栏组件、工具栏组件、中心组件组件、停靠栏组件和状态栏组件。对于程序员来讲对这些概念再熟悉不过了。Qt是面向对象的GUI开发平台,所以上述封装在MainWindow中的组件自然也是以类的形式存在:
1. 菜单栏组件QMenuBar
1.1 下拉菜单项组QMenu
1.2 菜单项QAction
2. 工具栏组件QToolBar
2.1 快捷项QAction
3. 状态栏组件QStatusBar
3.1 任意组件QWidget
新建基类为QMainWindow的Qt Gui应用程序:
//main.cpp
#include
#include "MainWindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
//MianWindow.h
#include
#include
#include
#include
#include
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
//初始化菜单栏
void InitMenuBar();
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
};
//MainWindow.cpp
#include "MainWindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
setWindowTitle("main_window");
InitMenuBar();
}
MainWindow::~MainWindow(){}
void MainWindow::InitMenuBar()
{
//从主窗口组件中获取菜单栏组件
QMenuBar *menu_bar = this->menuBar();
//定义菜单项组,显示名称为"File(F)","(&F)"用于快捷键
QMenu *menu = new QMenu("File(&F)", this);
//定义open菜单项,"Open(O)"为菜单项名称
QAction *action_open = new QAction("Open(O)", this);
//为菜单项定义快捷键,QKeySequence是Qt中与快捷键相关的类
action_open->setShortcut(QKeySequence(Qt::Key_O));
QAction *action_new = new QAction("New(N)", this);
action_new->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_N));
QAction *action_save = new QAction("Save(S)", this);
action_save->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_S));
//将菜单项加入菜单项组
menu->addAction(action_open);
menu->addAction(action_new);
menu->addAction(action_save);
//将菜单项组加入菜单栏
menu_bar->addMenu(menu);
}
工具栏是主窗口继承各种各种功能的实现快捷使用的区域,它并不是Gui程序中必须存在的组件。工具栏中的元素一般是以图标按钮的方式存在。
#include <QToolBar>
#include <QIcon>
void MainWindow::InitToolBar()
{
//为主窗口添加工具栏
QToolBar* tool_bar = this->addToolBar("tool bar");
//定义工具栏项,工具栏项不需要名称
QAction* action = new QAction("", this);
//设置工具栏不可浮动,默认是可浮动的
tool_bar->setFloatable(false);
//设置工具栏不可移动,默认是可以移动的
tool_bar->setMovable(false);
//设置工具栏项的提示文字,即鼠标停在该元素时显示
action->setToolTip("Open");
//设置工具栏项图标
action->setIcon(QIcon(":/pic/open.png"));
//将工具栏项添加至工具栏
tool_bar->addAction(action);
}
open.png是工具栏元素中的图标,需要在Qt Create中添加资源文件:
(1) 创建xxx.qrc资源文件
右键项目 -> 添加新文件,选择Qt,资源文件 -> 点击浏览,选择存放图标文件的目录,键入名称xxx -> 添加前缀、添加图标文件
(2) 添加资源文件
右键项目 -> 添加现有文件 -> 选择刚才目录下的xxx.qrc
这样就将资源文件添加到Qt Qreate了。需要注意,代码中对图片文件的引用,其前缀和文件名称需要与资源文件中的对应。
工具栏项除了可以是图标文件,还可以是其他各种其他Widget窗口元素:
void MainWindow::InitToolBar()
{
//...
QPushButton *btn = new QPushButton("1");
QLabel* label = new QLabel("hello");
QLineEdit *line_edit = new QLineEdit();
tool_bar->addAction(action);
//将其它窗口组件加入工具栏
tool_bar->addWidget(btn);
tool_bar->addWidget(label);
tool_bar->addWidget(line_edit);
}
状态栏一般位于主窗口的底部,是GUI程序中输出简要信息的区域:如表示当前程序状态的实时消息,表示程序版本号的永久消息,表示百分比/进度条提示的进度消息。
Gui程序中状态栏的设计原则一般为左边区域用于输出实时消息,右边区域用于设置永久消息。在Qt中,将Widget添加到状态栏用addWidget()函数是添加到左半部分,addPermanenWinget()是添加到右半部分。
void MainWindow::InitStatusBar()
{
//获取主窗口中的状态栏
QStatusBar* status_bar = statusBar();
//定义标签栏
QLabel *lable = new QLabel("lable", this);
//定义按钮
QPushButton* btn = new QPushButton("Button", this);
//将标签添加到状态栏的右边
status_bar->addPermanentWidget(lable);
//status_bar->addWidget(btn);
//设置状态栏的提示信息,显示在左边
status_bar->showMessage("HelloWorld");
}