QMainWindow

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

1 菜单栏

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

(1)创建菜单栏

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

函数原型

QMenuBar* menuBar() const;

创建

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

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

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

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

(3)添加菜单

QAction* addMenu(QMenu * menu);
QMenu* addMenu(const QString & title);
QMenu* addMenu(const QIcon & icon, const QString & title);

目前只有第二个熟悉

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

查看效果

(4)创建菜单项

函数原型

QAction* activeAction() const;

QAction* addAction(const QString & text);

QAction* addAction(const QIcon & icon, const QString & text);

QAction* addAction(const QString & text, const QObject * receiver,
                   const char * member, const QKeySequence & shortcut = 0);

QAction* addAction(const QIcon & icon, const QString & text, 
                   const QObject * receiver, const char * member, 
                   const QKeySequence & shortcut = 0);

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

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

 还可以添加子菜单

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

完整代码

#include "mainwindow.h"
#include <QMenuBar>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    // 重置窗口尺寸
    resize(600, 400);

    // 1 菜单栏,最多只能有一个
    QMenuBar* bar = menuBar();
    // 将菜单栏设置到窗口中
    this->setMenuBar(bar);
    // 添加菜单
    QMenu* fileMenu = bar->addMenu("文件");
    QMenu* editMenu = bar->addMenu("编辑");

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

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

效果

步骤:

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

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

(3)添加菜单;

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

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

2 工具栏

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

(1)创建工具栏

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

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

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

停靠位置查看

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

效果,工具栏在左侧

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

toolBar->addAction(newAction);
// 添加分割线
toolBar->addSeparator();
toolBar->addAction(openAction);

完整代码

#include "mainwindow.h"
#include <QMenuBar>
#include <QToolBar>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    // 重置窗口尺寸
    resize(600, 400);

    // 1 菜单栏,最多只能有一个
    QMenuBar* bar = menuBar();
    // 将菜单栏设置到窗口中
    this->setMenuBar(bar);
    // 添加菜单
    QMenu* fileMenu = bar->addMenu("文件");
    QMenu* editMenu = bar->addMenu("编辑");

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

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


    // 2 工具栏,可以有多个
    QToolBar* toolBar = new QToolBar(this);
    // 将工具栏放到窗口中
//    addToolBar(toolBar);
    addToolBar(Qt::LeftToolBarArea, toolBar);     // 设置停靠位置
    // 只允许在左右停靠
    toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
    // 设置浮动,关掉浮动
    toolBar->setFloatable(false);
    // 设置移动,不能移动
    toolBar->setMovable(false);
    // 工具栏可以添加菜单项。和文件里面的功能一样
    toolBar->addAction(newAction);
    // 添加分割线
    toolBar->addSeparator();
    toolBar->addAction(openAction);
}

效果

步骤:

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

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

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

3 状态栏

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

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

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

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

QStatusBar* sBar = statusBar();

注意:这里不用于new

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

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

(3)给状态栏添加信息

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

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

效果

 

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

// 加到右侧信息
QLabel* label2 = new QLabel("右侧信息", this);
sBar->addPermanentWidget(label2);

// 中间插入信息
QLabel* label3 = new QLabel("中间信息", this);
sBar->insertWidget(1, label3);

完整代码

 

#include "mainwindow.h"
#include <QMenuBar>
#include <QToolBar>
#include <QStatusBar>
#include <QLabel>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
   

    // 3、状态栏。只能有一个,不用new
   QStatusBar* sBar = statusBar();
   // 添加到窗口
   this->setStatusBar(sBar);
   // 添加标签。提示的文本和父窗口
   QLabel* label1 = new QLabel("左侧信息", this);
   sBar->addWidget(label1);

   // 加到右侧信息
   QLabel* label2 = new QLabel("右侧信息", this);
   sBar->addPermanentWidget(label2);

   // 中间插入信息
   QLabel* label3 = new QLabel("中间信息", this);
   sBar->insertWidget(1, label3);
}

4 铆接部件和核心部件

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

头文件QDockWidget

添加铆接部件

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

设置到窗口中

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

效果

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

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

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

效果

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

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

 效果

无法移动到其他位置

5 小总结 

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值