Loading

【2】QMainWindow

五、QMainWindow

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

5.1 菜单栏

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

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

// 菜单栏创建
QMenuBar *bar = menuBar();
// 将菜单栏放入到窗口中
this->setMenuBar(bar);

2)创建菜单,调用 QMenu 的成员函数 addMenu 来添加菜单

// 创建菜单
QMenu * fileMenu = bar->addMenu("文件");
QMenu * editMenu = bar->addMenu("编辑");

【addMenu 函数】

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

3)创建菜单项,调用 QMenu 的成员函数 addAction 来添加菜单项

// 创建菜单项,🍓 如果不需要返回值,[] 部分内容可以省略
[QAction * newAction = ]fileMenu->addAction("新建");
// 添加分割线
fileMenu->addSeparator();
[QAction * openAction = ]fileMenu->addAction("打开");

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

【addAction 函数】

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)

【窗口说明图】

5.2 工具栏

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

1)直接调用 QMainWindow 类的 addToolBar()函数获取主窗口的工具条对象,每增加一个工具条都需要调用一次该函数。

QToolBar * toolBar = new QToolBar(this);
addToolBar(Qt::LeftToolBarArea,toolBar);

2)插入属于工具条的动作,即在工具条上添加操作。通过 QToolBar 类的 addAction 函数添加。

//工具栏中可以设置内容
toolBar->addAction(newAction);
//添加分割线
toolBar->addSeparator();
toolBar->addAction(openAction);
//工具栏中添加控件
QPushButton * btn = new QPushButton("aa" , this);
toolBar->addWidget(btn);

3)工具条是一个可移动的窗口,它的停靠区域由 QToolBar 的 allowAreas 决定,包括:

  • Qt::LeftToolBarArea 停靠在左侧

  • Qt::RightToolBarArea 停靠在右侧

  • Qt::TopToolBarArea 停靠在顶部

  • Qt::BottomToolBarArea 停靠在底部

  • Qt::AllToolBarAreas 以上四个位置都可停靠

  • 使用 setAllowedAreas()函数指定停靠区域

    • setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea)
  • 使用 setMoveable()函数设定工具栏的可移动性

    • setMoveable(false)//工具条不可移动,只能停靠在初始化的位置上

5.3 状态栏

状态栏最多有一个,QStatusBar 类,派生自 QWidget 类,使用方法与 QWidget 类似。

【使用示例】

QStatusBar * stBar = statusBar();
//设置到窗口中
setStatusBar(stBar);

//放标签控件
QLabel * label = new QLabel("提示信息",this);
stBar->addWidget(label);

QLabel * label2 = new QLabel("右侧提示信息",this);
stBar->addPermanentWidget(label2);

【示例结果】

【成员函数】

//添加小部件
void addWidget(QWidget * widget, int stretch = 0)
//插入小部件
int	insertWidget(int index, QWidget * widget, int stretch = 0)
//删除小部件
void removeWidget(QWidget * widget)

5.4 铆接部件与核心部件(中心部件)

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

//铆接部件 (浮动窗口) 可以有多个
QDockWidget * dockWidget = new QDockWidget("浮动",this);
addDockWidget(Qt::BottomDockWidgetArea,dockWidget);
//设置后期停靠区域,只允许上下
dockWidget->setAllowedAreas( Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea |Qt::LeftDockWidgetArea);

中心显示的部件都可以作为核心部件,只能有一个。例如一个记事本文件,可以利用 QTextEdit 做核心部件

QTextEdit * edit = new QTextEdit(this);
setCentralWidget(edit);

5.5 资源文件

Qt 资源系统是一个跨平台的资源机制,用于将程序运行时所需要的资源以二进制的形式存储于可执行文件内部。如果你的程序需要加载特定的资源(图标、文本翻译等),那么,将其放置在资源文件中,就再也不需要担心这些文件的丢失。也就是说,如果你将资源以资源文件形式存储,它是会编译到可执行文件内部。

使用 Qt Creator 可以很方便地创建资源文件。

1)将需要添加的文件,如图片等导入项目所在文件夹。

2)在工程上点右键,选择 “添加新文件…”,可以在 Qt 分类下找到 “Qt 资源文件”,点击 “选择…” 按钮,打开 “新建 Qt 资源文件” 对话框。

3)输入资源文件的名字和路径,点击下一步,选择所需要的版本控制系统,然后直接选择完成。

4)可以在 Qt Creator 的左侧文件列表中看到 “资源文件” 一项,也就是新创建的资源文件。在资源文件上右键进入资源文件编辑模式

5)首先需要添加前缀,点击添加按钮,选择添加前缀,输入前缀名,最简单可以输入一个 /,此处将前缀取名为 images。前缀用以区分项目中不同的资源。

6)点击添加,选择添加文件,在弹出的文件夹下选择之前导入的 images 文件夹,选择文件夹下要导入的资源(图片)。点击编译,在资源文件下 res.qrc 可看到导入的图像。

7)使用

创建项目时创建 ui 文件,双击 ui 文件,进入界面开发。添加一些控件。

新建添加图标

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 🍓 添加图标
    ui->actionNew->setIcon(QIcon(":/images/Image/Sunny.jpg"));
}

MainWindow::~MainWindow()
{
    delete ui;
}

资源文件引用时,路径名 ": + 前缀名 + 文件名"

  • 可以为文件取别名,然后使用别名引用。好处,原文件名被修改,不需要修改代码,仍使用别名引用它。

  • 编译之后,Qt 将引入的资源编译成了 C++ 代码。在目录中可以找到相应的 cpp 文件。(并没有找到?)

posted @ 2020-08-25 23:35  喵喵巫  阅读(698)  评论(0编辑  收藏  举报