Qt中的主窗口QMainWindow

  GUI应用程序都有一个主窗口,虽然前面讲到的QWidget组件也可以定义生成主窗口,但是Qt还定义了一个专门用于实现主窗口的类QMainWindow。为什么?跟QDialog一样的道理,主窗口具有许多主窗口特有的元素组件,为了程序的复用性,Qt在QWidget的基础上“特例化”了一个QMainWindow。

  GUI程序是由一个主窗口和多个对话框组成,主窗口是与用户进行长时间交互的窗口,是程序启动后显示的第一个窗口,程序的绝大多数功能是直接由主窗口提供,辅助功能由对话框提供。

  QMainWindow是Qt中主窗口的基类:
Qt中的主窗口QMainWindow_第1张图片

  显然,QMainWindow是一种容器类型的组件。

  QMainWindow封装了主窗口常用的菜单栏组件、工具栏组件、中心组件组件、停靠栏组件和状态栏组件。对于程序员来讲对这些概念再熟悉不过了。Qt是面向对象的GUI开发平台,所以上述封装在MainWindow中的组件自然也是以类的形式存在:

1. 菜单栏组件QMenuBar
1.1 下拉菜单项组QMenu
1.2 菜单项QAction

2. 工具栏组件QToolBar
2.1 快捷项QAction

3. 状态栏组件QStatusBar
3.1 任意组件QWidget

1. 菜单栏组件

  新建基类为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);
}

  编译运行:
Qt中的主窗口QMainWindow_第2张图片

2. 工具栏组件

  工具栏是主窗口继承各种各种功能的实现快捷使用的区域,它并不是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了。需要注意,代码中对图片文件的引用,其前缀和文件名称需要与资源文件中的对应。

  运行:
Qt中的主窗口QMainWindow_第3张图片

  工具栏项除了可以是图标文件,还可以是其他各种其他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);
}

  编译运行:
Qt中的主窗口QMainWindow_第4张图片

3. 状态栏组件

  状态栏一般位于主窗口的底部,是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");
}

  运行:
Qt中的主窗口QMainWindow_第5张图片

你可能感兴趣的:(Qt编程,QMenuBar,QToolBar,QStatusBar,QAction)