Qt深入浅出(七)QMainWindow

窗口类QMainWindow

​ 普通的桌面应用程序有个共同的特性,有菜单栏、工具栏、状态栏、中央窗口等部件。菜单栏其实可以看成是一个窗口,菜单栏中的每一个菜单也可以看成一个窗口,每个部件基本都可以认为是一个窗口。那么这些典型的桌面应用可以认为是一些QWidget的组合,通过QWidget派生的方式也确实能够完成这样的窗口。

​ 但是如果每次都自己去设计,重复这些工作,想想都有些麻烦,于是Qt帮我们实现这样的窗口,叫做QMainWindow,QMainWindow已经布置好菜单栏、工具栏、状态栏等窗口,我们只需要懂得如何去应用就行了。

  • QMainWindow的布局

注:MenuBar是菜单栏,toolbars是工具栏,Dock Widgets是停口窗口,Central Widget是中央窗口,Status Bar是状态栏

1 创建一个QMainWindow工程

  1. 在 Qt Creator 中,点击菜单”文件”

  2. 依次选择 “新建文件或项目->application->Qt widget application” 再点击 Choose…按钮

  3. 然后填写项目名称点击下一步, 到配置工具链窗口,再点击下一步.

  4. 到如图所示的窗口, 选择基类为 QMainWindow, 不勾选”创建界面”(其实也可以勾选), 如图


  5. 再点击下一步, 到版本控制窗口,然后再点击完成,那么我们的 QMainWindow 的一个工程就创建好了。

2 菜单栏应用

2.1 添加菜单栏

​ 在Qt中菜单栏类是QMenuBar,它也是继承至QWidget,菜单栏是一个长条状窗口,可以是横向也可以是纵向的,菜单栏上可以布置菜单。

  • 通过QMainWindow::MenuBar() 来获取一个QMenuBar对象的指针, 如果该对象不存在, 就新建一个对象。这个函数只能创建一个菜单栏,函数原型如下:


   
   
  1. QMenuBar *QMainWindow::menuBar()

​ 例如:


   
   
  1. #include "mainwindow.h"
  2. #include <QMenubar>
  3. MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
  4. {
  5.    QMenuBar* menuBar = this->menuBar();
  6. }

  • 也可以通过new一个QMenuBar对象,然后通过QMainWindow::setMenuBar来设置主窗口的菜单栏。


   
   
  1. void QMainWindow::setMenuBar(QMenuBar *menuBar)

​ 例如:


   
   
  1. #include "mainwindow.h"
  2. #include <QMenubar>
  3. MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
  4. {
  5.    QMenuBar* menuBar = new QMenuBar;
  6.    this->setMenuBar(menuBar);
  7. }

2.2 添加菜单

​ 创建完菜单栏之后,就可以在菜单栏上面布置菜单了,菜单类叫作QMenu,QMenu也是继承至QWidget。

  • QMenuBar对象中添加QMenu对象可以使用函数:


   
   
  1. QAction *QMenuBar::addMenu(QMenu *menu)   //添加一个已经创建好的QMenu对象
  2. QMenu *QMenuBar::addMenu(const QString &title) //给定菜单标题,自动创建QMenu对象

例如:


   
   
  1. #include "mainwindow.h"
  2. #include <QMenubar>
  3. #include <QMenu>
  4. MainWindow::MainWindow(QWidget *parent)
  5.   : QMainWindow(parent)
  6. {
  7.    QMenuBar* menuBar = this->menuBar();
  8.    QMenu *fileMenu = new QMenu("文件(&F)", menuBar);
  9.    menuBar->addMenu(fileMenu);
  10.      
  11.    QMenu *editMenu = menuBar->addMenu("编辑(&E)");
  12.    
  13. }

2.3 添加动作

​ 菜单中的诸如打开、保存、关闭等,都是一个个动作,在Qt里面对应的类是QAction,它不是窗口类,它是继承至QObject。可以使用QMenu::addAction来添加动作,QMenu::addAction有多个重载的函数,都是返回一个新建的QAction对象。


   
   
  1. QAction* addAction(const QString &text)
  2. QAction* addAction(const QIcon &icon, const QString &text)
  3. QAction* addAction(const QString &text, const QObject *receiver, const char *member, const QKeySequence &shortcut = 0)
  4. QAction* addAction(const QIcon &icon, const QString &text, const QObject *receiver, const char *member, const QKeySequence &shortcut = 0)

  • 添加一个最简单的动作


   
   
  1. #include "mainwindow.h"
  2. #include <QMenuBar>
  3. #include <QMenu>
  4. #include <QIcon>
  5. #include <QKeySequence>
  6. MainWindow::MainWindow(QWidget *parent)
  7.   : QMainWindow(parent)
  8. {
  9.    this->resize(600, 480);
  10.    QMenuBar * menuBar = this->menuBar();
  11.    QMenu *  fileMenu = new QMenu("文件(&F)", menuBar);
  12.    menuBar->addMenu(fileMenu);
  13.    fileMenu->addAction("close");
  14. }
  • 添加一个带图标的动作


   
   
  1. fileMenu->addAction(QIcon("E:\\close.png"), "close");

​ QIcon是图标类,没有继承任何基类,它的作用就是将图片加载到Qt应用中来,可以当做图标来使用。

  • 添加一个与当前窗口close()槽函数链接的QAction


   
   
  1. fileMenu->addAction("close", this, SLOT(close()));

  • 添加一个与当前窗口close()槽函数链接的QAction,并且设置一个快捷键


   
   
  1. fileMenu->addAction("close", this, SLOT(close()), QKeySequence("Ctrl+Q"));

​ QKeySequence是快捷键类,没有继承任何基类,就是用来设置快捷方式。

   

 

  • 添加一个带图标与当前窗口close()槽函数链接的QAction,并且设置一个快捷键


   
   
  1. fileMenu->addAction(QIcon("E:\close.png"), "close",
  2.                    this, SLOT(close()), QKeySequence("Ctrl+Q"));

  • 设置QAction为可点选状态


   
   
  1. void setCheckable(bool)

2.4 添加分隔符

​ 分隔符可以起到修饰的作用,使用QMenu::addSeparator()添加分割符号。


   
   
  1. QAction *QMenu::addSeparator()

2.5 添加子菜单

​ 在菜单中添加一个子菜单,调用QMenu::addMenu()。


   
   
  1. QAction *QMenu::addMenu(QMenu *menu)     //添加一个已经创建好的QMenu对象
  2. QMenu *QMenu::addMenu(const QString &title) //给定菜单标题,自动创建QMenu对象

3 工具栏应用

3.1 添加工具栏

​ 工具栏类是QToolbar,QToolbar对象中可以布置一些QAction动作,QToolbar继承至QWidget,主窗口可以使用QMainWindow::addToolBar来添加工具栏。


   
   
  1. QToolBar *QMainWindow::addToolBar(const QString &title) //创建一个窗口标题为title的工具栏
  2. void QMainWindow::addToolBar(QToolBar *toolbar) //添加一个已经存在的toolbar对象
  3. void QMainWindow::addToolBar(Qt::ToolBarArea area, QToolBar *toolbar)//添加一个已经存在的toolbar对象到指定区域,Qt::ToolBarArea是工具栏位置的枚举类型。

​ 例如:


   
   
  1. #include "mainwindow.h"
  2. #include <QToolBar>
  3. MainWindow::MainWindow(QWidget *parent)
  4.   : QMainWindow(parent)
  5. {
  6.    this->addToolBar("tool bar 1");
  7.    QToolBar* toolBar = new QToolBar("tool bar 2", this);
  8.    this->addToolBar(Qt::LeftToolBarArea, toolBar); //添加一个工具栏到左边区域。
  9. }

3.2 添加动作

​ 工具栏上面也能添加动作QAction对象,使用QToolBar::addAction。


   
   
  1. QAction *QToolBar::addAction(const QString &text)
  2. QAction *QToolBar::addAction(const QIcon &icon, const QString &text)
  3. QAction *QToolBar::addAction(const QString &text, const QObject *receiver, const char *member)
  4. QAction *QToolBar::addAction(const QIcon &icon, const QString &text, const QObject *receiver, const char *member)


   
   
  1. #include "mainwindow.h"
  2. #include <QToolBar>
  3. MainWindow::MainWindow(QWidget *parent)
  4.   : QMainWindow(parent)
  5. {
  6.    this->resize(600, 480);
  7.    QToolBar* toolBar = this->addToolBar("tool bar");
  8.    /*在QToolBar中添加一个close动作*/
  9.    toolBar->addAction("close");
  10.    //添加一个带图标QAction
  11.    toolBar->addAction(QIcon("E:\\close.png"), "close");
  12.    //添加一个与当前窗口close()槽函数链接的QAction
  13.    toolBar->addAction("close", this, SLOT(close()));
  14.    //添加一个带图标与当前窗口close()槽函数链接的QAction
  15.    toolBar->addAction(QIcon("E:\\close.png"), "close",
  16.                   this, SLOT(close()));
  17. }

​ QAction对象可以复用,那么可以把菜单上面的动作对象拿下来使用。一般的桌面型应用菜单跟工具栏的动作往往是共用的。

4 状态栏应用

​ Qt中的状态栏类是QStatusBar,也是继承至QWidget,状态栏用来显示程序的运行状态,比如“就绪、编辑中”。

4.1 创建状态栏

  • QMainWindow中创建状态栏可以使用QMainWindow::statusBar


   
   
  1. QStatusBar *QMainWindow::statusBar() const

​ 如果QStatusBar对象不存在,就新建一个。如果存在就返回QStatusBar对象。用这个函数也只能创建一个

QStatusBar对象。

  • 也可以自己创建,然后使用QMainWindow::setStatusBar设置主窗口的状态栏


   
   
  1. void QMainWindow::setStatusBar(QStatusBar *statusbar)

4.2 设置状态栏信息

  • QStatusBar::showMessage函数可以用来设置状态栏的显示信息


   
   
  1. [slot] void QStatusBar::showMessage(const QString &message, int timeout = 0)
  2.  // message是具体要显示的信息,timeout为显示多长时间,单位为毫秒。

例如:


   
   
  1. #include "mainwindow.h"
  2. #include <QStatusBar>
  3. MainWindow::MainWindow(QWidget *parent)
  4.   : QMainWindow(parent)
  5. {
  6.    QStatusBar * statusBar = this->statusBar();
  7.    statusBar->showMessage("就绪", 5000);
  8. }

5 设置中央窗口

​ QMainWindow的中央窗口可以使用QMainWindow::CentralWidget来设置一个QWidget对象或者派生类对象作为主窗口的中央窗口。


   
   
  1. void QMainWindow::setCentralWidget(QWidget *widget)

​ 例如:


   
   
  1. #include "mainwindow.h"
  2. #include <QTextEdit>
  3. MainWindow::MainWindow(QWidget *parent)
  4.   : QMainWindow(parent)
  5. {
  6.    QTextEdit * edit = new QTextEdit(this);
  7.    this->setCentralWidget(edit);
  8. }

​ 将一个QTextEdit作为主窗口的中央窗口,QTextEdit是一个文本编辑窗口,继承至QAbstractScrollArea。

6 设置停靠窗口

​ Qt中停靠窗口类为QDockWidget,QDockWidget继承至QWidget,这种窗口可以停靠在主窗口的停靠区域。

  • QDockWidget构造函数有两个


   
   
  1. QDockWidget::QDockWidget(const QString &title, QWidget *parent = Q_NULLPTR, Qt::WindowFlags flags = Qt::WindowFlags()); //title窗口标题,parent父窗口,flags窗口属性
  2.  
  3. QDockWidget::QDockWidget(QWidget *parent = Q_NULLPTR, Qt::WindowFlags flags = Qt::WindowFlags());
  4.  //parent父窗口,flags窗口属性
  • QDockWidget对象并不能当作普通窗口来使用,但是可以在个窗口上嵌套一个普通窗口


   
   
  1. void QDockWidget::setWidget(QWidget *widget) //用来设置一个普通窗口到停靠窗口中

  • QMainWindow的停靠窗口可以使用QMainWindow::addDockWidget来设置一个QDockWidget对象或者派生类对象作为主窗口的中央窗口。


   
   
  1. void QMainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget)
  2. void QMainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget, Qt::Orientation orientation)

​ 例如:


   
   
  1. #include "mainwindow.h"
  2. #include <QTextEdit>
  3. #include <QDockWidget>
  4. #include <QPushButton>
  5. MainWindow::MainWindow(QWidget *parent)
  6.   : QMainWindow(parent)
  7. {
  8.    QTextEdit * edit1 = new QTextEdit("mainWindow", this);
  9.    this->setCentralWidget(edit1); //设置中央窗口
  10.    QDockWidget* dock = new QDockWidget("dock", this); //新建一个标题为dock的停靠窗口
  11.    QTextEdit * edit2 = new QTextEdit("dock", dock);
  12.    dock->setWidget(edit2); //将edit2嵌套到停靠窗口中
  13.    this->addDockWidget(Qt::LeftDockWidgetArea, dock); //主窗口添加dock停靠窗口到左边停靠区域
  14. }

发布了207 篇原创文章 · 获赞 66 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/qq_38025219/article/details/104888032