Qt中的主窗口QMainWindow

来源:互联网 发布:bm相似度算法 编辑:程序博客网 时间:2024/05/17 23:18

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

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

  QMainWindow是Qt中主窗口的基类:
这里写图片描述

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

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

1. 菜单栏组件QMenuBar1.1 下拉菜单项组QMenu1.2 菜单项QAction2. 工具栏组件QToolBar2.1 快捷项QAction3. 状态栏组件QStatusBar3.1 任意组件QWidget

1. 菜单栏组件

  新建基类为QMainWindow的Qt Gui应用程序:

//main.cpp#include <QtGui/QApplication>#include "MainWindow.h"int main(int argc, char *argv[]){    QApplication a(argc, argv);    MainWindow w;    w.show();    return a.exec();}//MianWindow.h#include <QtGui/QMainWindow>#include <QKeySequence>#include <QMenuBar>#include <QMenu>#include <QAction>class MainWindow : public QMainWindow{    Q_OBJECTprivate:    //初始化菜单栏    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);}

  编译运行:
这里写图片描述

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了。需要注意,代码中对图片文件的引用,其前缀和文件名称需要与资源文件中的对应。

  运行:
这里写图片描述

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

  编译运行:
这里写图片描述

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");}

  运行:
这里写图片描述

原创粉丝点击