• QMainWindow


    QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序的基础,如文本编辑器,图片编辑器等。

    1 菜单栏

    一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题栏下面。

    (1)创建菜单栏

    通过QMainWindow类的menubar()函数获取主窗口菜单栏指针

    函数原型

    QMenuBar* menuBar() const

    创建

    1. // 菜单栏,最多只能有一个
    2. QMenuBar* bar = menuBar();

    (2)将菜单项设置到窗口中

    1. // 将菜单栏设置到窗口中
    2. this->setMenuBar(bar);

    这是运行还是没有显示,因为菜单栏没有内容。

    (3)添加菜单

    1. QAction* addMenu(QMenu * menu);
    2. QMenu* addMenu(const QString & title);
    3. QMenu* addMenu(const QIcon & icon, const QString & title);

    目前只有第二个熟悉

    1. QMenu* fileMenu = bar->addMenu("文件");
    2. QMenu* editMenu = bar->addMenu("编辑");

    查看效果

    (4)创建菜单项

    函数原型

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

     Qt 并没有专门的菜单项类,只是使用一个QAction类,抽象出公共的动作。当我们把QAction对象添加到菜单,就显示成一个菜单项,添加到工具栏,就显示成一个工具按钮。用户可以通过点击菜单项、点击工具栏按钮、点击快捷键来激活这个动作。

    1. // 菜单项
    2. QAction* newAction = fileMenu->addAction("新建");
    3. // 添加分割线
    4. fileMenu->addSeparator();
    5. QAction* openAction = fileMenu->addAction("打开");

     还可以添加子菜单

    1. // 菜单项中有子菜单
    2. QMenu* subMenu = new QMenu;
    3. subMenu->addAction("子菜单1");
    4. subMenu->addAction("子菜单2");
    5. newAction->setMenu(subMenu);

    完整代码

    1. #include "mainwindow.h"
    2. #include <QMenuBar>
    3. MainWindow::MainWindow(QWidget *parent)
    4. : QMainWindow(parent)
    5. {
    6. // 重置窗口尺寸
    7. resize(600, 400);
    8. // 1 菜单栏,最多只能有一个
    9. QMenuBar* bar = menuBar();
    10. // 将菜单栏设置到窗口中
    11. this->setMenuBar(bar);
    12. // 添加菜单
    13. QMenu* fileMenu = bar->addMenu("文件");
    14. QMenu* editMenu = bar->addMenu("编辑");
    15. // 菜单项
    16. QAction* newAction = fileMenu->addAction("新建");
    17. // 添加分割线
    18. fileMenu->addSeparator();
    19. QAction* openAction = fileMenu->addAction("打开");
    20. // 菜单项中有子菜单
    21. QMenu* subMenu = new QMenu;
    22. subMenu->addAction("子菜单1");
    23. subMenu->addAction("子菜单2");
    24. newAction->setMenu(subMenu);
    25. }

    效果

    步骤:

    (1)新建菜单栏,只能有一个;

    (2)将菜单栏设置到窗口中;

    (3)添加菜单;

    (4)添加菜单项(添加分割线);

    (5)菜单中有子菜单,添加子菜单。

    2 工具栏

    主窗口的工具栏上可以有多个工具条,通常采用一个菜单对应一个工具条的的方式,也可根据需要进行工具条的划分。

    (1)创建工具栏

    1. 工具栏,可以有多个
    2. QToolBar* toolBar = new QToolBar(this);

    (2)将工具栏放到窗口中

    1. // 将工具栏放到窗口中
    2. // addToolBar(toolBar); // 默认停靠在上侧
    3. addToolBar(Qt::LeftToolBarArea, toolBar); // 设置停靠位置
    4. // 只允许在左右停靠
    5. toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
    6. // 设置浮动,关掉浮动
    7. toolBar->setFloatable(false);
    8. // 设置移动,不能移动
    9. toolBar->setMovable(false);

    停靠位置查看

    1. Qt::LeftToolBarArea // 停靠在左侧
    2. Qt::RightToolBarArea // 停靠在右侧
    3. Qt::TopToolBarArea // 停靠在顶部
    4. Qt::BottomToolBarArea // 停靠在底部
    5. Qt::AllToolBarAreas // 以上四个位置都可停靠

    效果,工具栏在左侧

     (3)工具栏可以添加菜单项。和文件里面的功能一样

    1. toolBar->addAction(newAction);
    2. // 添加分割线
    3. toolBar->addSeparator();
    4. toolBar->addAction(openAction);

    完整代码

    1. #include "mainwindow.h"
    2. #include <QMenuBar>
    3. #include <QToolBar>
    4. MainWindow::MainWindow(QWidget *parent)
    5. : QMainWindow(parent)
    6. {
    7. // 重置窗口尺寸
    8. resize(600, 400);
    9. // 1 菜单栏,最多只能有一个
    10. QMenuBar* bar = menuBar();
    11. // 将菜单栏设置到窗口中
    12. this->setMenuBar(bar);
    13. // 添加菜单
    14. QMenu* fileMenu = bar->addMenu("文件");
    15. QMenu* editMenu = bar->addMenu("编辑");
    16. // 菜单项
    17. QAction* newAction = fileMenu->addAction("新建");
    18. // 添加分割线
    19. fileMenu->addSeparator();
    20. QAction* openAction = fileMenu->addAction("打开");
    21. // 菜单项中有子菜单
    22. QMenu* subMenu = new QMenu;
    23. subMenu->addAction("子菜单1");
    24. subMenu->addAction("子菜单2");
    25. newAction->setMenu(subMenu);
    26. // 2 工具栏,可以有多个
    27. QToolBar* toolBar = new QToolBar(this);
    28. // 将工具栏放到窗口中
    29. // addToolBar(toolBar);
    30. addToolBar(Qt::LeftToolBarArea, toolBar); // 设置停靠位置
    31. // 只允许在左右停靠
    32. toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
    33. // 设置浮动,关掉浮动
    34. toolBar->setFloatable(false);
    35. // 设置移动,不能移动
    36. toolBar->setMovable(false);
    37. // 工具栏可以添加菜单项。和文件里面的功能一样
    38. toolBar->addAction(newAction);
    39. // 添加分割线
    40. toolBar->addSeparator();
    41. toolBar->addAction(openAction);
    42. }

    效果

    步骤:

    (1)新建工具栏,可以有多个;

    (2)将工具栏放到窗口中;

    (3)工具栏可以添加菜单项。和文件里面的功能一样。

    3 状态栏

    派生自QWidget类,使用方法与QWidget类似,QStatusBar类常用成员函数:

    状态栏也只能最多有一个。

    word的下面的信息就是状态栏

     (1)添加状态栏(头文件QStatusBar)

    QStatusBar* sBar = statusBar();

    注意:这里不用于new

    (2)将状态栏添加到窗口

    1. // 添加到窗口
    2. this->setStatusBar(sBar);

    (3)给状态栏添加信息

    状态栏一般是提示信息(头文件QLabel)

    1. // 添加标签。提示的文本和父窗口
    2. QLabel* label1 = new QLabel("左侧信息", this);
    3. sBar->addWidget(label1);

    效果

     

    也可以在右测添加信息、也可以插入信息

    1. // 加到右侧信息
    2. QLabel* label2 = new QLabel("右侧信息", this);
    3. sBar->addPermanentWidget(label2);
    4. // 中间插入信息
    5. QLabel* label3 = new QLabel("中间信息", this);
    6. sBar->insertWidget(1, label3);

    完整代码

     

    1. #include "mainwindow.h"
    2. #include <QMenuBar>
    3. #include <QToolBar>
    4. #include <QStatusBar>
    5. #include <QLabel>
    6. MainWindow::MainWindow(QWidget *parent)
    7. : QMainWindow(parent)
    8. {
    9. // 3、状态栏。只能有一个,不用new
    10. QStatusBar* sBar = statusBar();
    11. // 添加到窗口
    12. this->setStatusBar(sBar);
    13. // 添加标签。提示的文本和父窗口
    14. QLabel* label1 = new QLabel("左侧信息", this);
    15. sBar->addWidget(label1);
    16. // 加到右侧信息
    17. QLabel* label2 = new QLabel("右侧信息", this);
    18. sBar->addPermanentWidget(label2);
    19. // 中间插入信息
    20. QLabel* label3 = new QLabel("中间信息", this);
    21. sBar->insertWidget(1, label3);
    22. }

    4 铆接部件和核心部件

    铆接部件 QDockWidget,也称浮动窗口,可以有多个。

    头文件QDockWidget

    添加铆接部件

    QDockWidget* dock = new QDockWidget("浮动窗口", this);

    设置到窗口中

    1. // 设置到窗口中,添加到下侧,围绕中间, 没有中心部件,就在上侧
    2. this->addDockWidget(Qt::BottomDockWidgetArea ,dock);

    效果

    因为没有中心部件,所以铆接部件在上侧

    添加中心部件:除了以上几个部件,中心显示的部件都可以作为核心部件,例如一个记事本文件,可以利用QTextEdit做核心部件

    1. // 5、中心部件,核心部件,也只能有一个
    2. QTextEdit* edit = new QTextEdit(this);
    3. // 添加到窗口
    4. setCentralWidget(edit);

    效果

     铆接部件也可以只设置在某些位置,比如只设置在上下位置

    1. // 设置只允许在上侧和下侧
    2. dock->setAllowedAreas(Qt::BottomDockWidgetArea | Qt::TopDockWidgetArea);

     效果

    无法移动到其他位置

    5 小总结 

    如果只有一个,像菜单栏、中心部件,则添加到窗口时,使用set函数;

    如果有多个,像工具栏、状态栏,则添加到窗口时,使用add函数;

  • 相关阅读:
    公网Windows,MAC,LINUX远程操控
    什么是著作权?对此你了解多少?
    光环:软件研发效能特征与度量——王一男
    halcon二维码识别简单案例
    IDC 中国边缘云市场最新报告解读:阿里云蝉联中国公有云市场第一
    原子性(juc编程)
    死锁的Demo,产生条件
    Redis的两种持久化方式RDB和AOF
    八、手把手教你搭建SpringCloudAlibaba之Sentinel服务降级
    LeetCode 每日一题 2021/6/27-2021/7/3
  • 原文地址:https://blog.csdn.net/Zhouzi_heng/article/details/125411487