QT-菜单栏、工具栏和状态栏
Qt菜单栏、工具栏和状态栏
菜单栏、工具栏和状态栏一般用在MainWindow项目中,菜单栏、工具栏位于窗口上放,状态栏位于窗口下方。
一、菜单栏
菜单栏位于窗口顶部,菜单栏中的每个菜单项可以展开显示更多的子菜单或直接执行某个动作。
QMenuBar是菜单栏类,菜单栏上可以有多个菜单项,用户单击菜单项后,会触发一个动作。因此在Qt中使用菜单栏涉及到3个类:QMenuBar菜单栏类、QMenu菜单类和QAction动作类。
1️⃣ QMenuBar
— 菜单栏类
- 作用:窗口最上方的菜单条控件,用来放 菜单(QMenu)。
- 功能:管理多个菜单,每个菜单都是下拉式的,用户可以点击展开。
- 示例:
QMenuBar *menuBar = new QMenuBar(this); // 创建菜单栏
- 通俗理解:就像 Windows 程序顶部的“文件 | 编辑 | 帮助”那一条。
2️⃣ QMenu
— 菜单类
- 作用:菜单栏里的一个下拉菜单,包含多个 动作(QAction)。
- 功能:承载多个 QAction,当用户点击时触发动作。
- 示例:
QMenu *fileMenu = new QMenu("文件", menuBar); // 创建“文件”菜单,父控件是 menuBar
menuBar->addMenu(fileMenu); // 把菜单添加到菜单栏
- 通俗理解:就是“文件”、“编辑”、“帮助”这样的菜单,点击会展开里面的选项。
3️⃣ QAction
— 动作类
- 作用:菜单里的具体操作条目,或者工具栏上的按钮都可以是 QAction。
- 功能:
- 可以显示文字、图标
- 可以被点击触发信号(通常是
triggered()
)
- 示例:
QAction *openAction = new QAction("打开", this); // 创建一个“打开”动作
fileMenu->addAction(openAction); // 添加到“文件”菜单
connect(openAction, &QAction::triggered, this, [](){qDebug() << "点击了打开";
});
- 通俗理解:就是“打开”、“保存”、“退出”这些菜单项,用户点击时会执行对应操作。
🔑 总结
类 | 作用 | 例子 |
---|---|---|
QMenuBar | 菜单栏,放置多个菜单 | 顶部菜单栏“文件 |
QMenu | 菜单,承载多个动作 | “文件”菜单、下拉列表 |
QAction | 动作,菜单里的具体条目,也可以放在工具栏上 | “打开”、“保存”、“退出” |
1、创建菜单栏
创建一个菜单栏,需要5个基本步骤:
(1)创建菜单栏对象
获取MainWindow窗口的菜单栏对象:
QMenuBar *bar = this->menuBar();//this是MainWindow实例
(2)添加菜单
为菜单栏添加一个或多个菜单项,每个菜单项都是一个QMenu
对象。
QMenuBar *bar = this->menuBar();
QMenu *fileMenu = bar->addMenu("文件(&F)"); //"&"表示快捷键,这里是Alt+F
或者
QMenu *fileMenu = new QMenu("文件(&F)");
bar->addMenu(fileMenu);
(3)添加动作
QAction
是一个表示动作的抽象类。可以关联到一个槽函数,当动作被触发时执行特定的代码逻辑。
QAction *open = fileMenu->addAction("打开文件"); // 在 fileMenu 菜单里添加一个动作,文字为“打开文件”,并返回 QAction 指针
QIcon icon(":/images/open_icon.png"); // 创建一个图标对象,路径是资源文件里的图片 ":/images/open_icon.png"
open->setIcon(icon); // 给 open 动作设置图标
open->setShortcut(QKeySequence::Open); // 给 open 动作设置快捷键 Ctrl+O,菜单中会显示快捷键
QAction *close = fileMenu->addAction("关闭"); // 在 fileMenu 菜单里添加一个“关闭”动作
fileMenu->addAction("文本")
→ 添加一个菜单项(QAction)到菜单里,同时返回 QAction 指针。setIcon()
→ 给菜单项添加图标,增强界面可视化。setShortcut()
→ 给菜单项设置快捷键,用户可以通过键盘快速触发动作。- 每个 QAction 都可以通过
triggered()
信号连接槽函数,实现点击或快捷键触发具体操作。 QKeySequence
是 Qt 定义的一个快捷键枚举和类,包含常用动作对应的标准快捷键。QKeySequence::Open
在大多数平台上默认映射为Ctrl+O
(Windows/Linux)。
(4)连接槽函数
&QAction::triggered
是 QAction
类的一个信号,当用户触发这个动作时(点击菜单项),这个信号会被发射。
connect(close, &QAction::triggered, this, &MainWindow::on_close_trigged);
(5)实现槽函数
void MainWindow::on_close_trigged(){ this->close();
}
完整代码示例:
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this); // 初始化 UI 界面QMenuBar *menuBar = this->menuBar(); // 获取主窗口自带的菜单栏QMenu *file = menuBar->addMenu("文件(&F)"); // 在菜单栏添加“文件”菜单,&F 表示快捷键 Alt+FQMenu *edit = menuBar->addMenu("编辑(&E)"); // 添加“编辑”菜单,Alt+EQMenu *view = menuBar->addMenu("视图(&V)"); // 添加“视图”菜单,Alt+VQMenu *build = menuBar->addMenu("构建(&B)"); // 添加“构建”菜单,Alt+BQAction *open = file->addAction("打开文件"); // 在“文件”菜单添加“打开文件”动作open->setIcon(QIcon(":/images/open.bmp")); // 给动作设置图标open->setShortcut(QKeySequence::Open); // 设置快捷键 Ctrl+O(Mac 上是 Command+O)QAction *close = file->addAction("关闭"); // 在“文件”菜单添加“关闭”动作close->setIcon(QIcon(":/images/close.bmp")); // 设置图标close->setShortcut(QKeySequence::Close); // 设置快捷键 Ctrl+W(或 Ctrl+F4,一般用于关闭窗口)QMenu *menu = edit->addMenu("查找/替换(&R)"); // 在“编辑”菜单里添加一个子菜单“查找/替换”,Alt+RQAction *find = menu->addAction("查找"); // 在子菜单添加“查找”动作find->setIcon(QIcon(":/images/find.bmp")); // 设置图标find->setShortcut(QKeySequence::Find); // 设置快捷键 Ctrl+FQAction *replace = menu->addAction("替换"); // 在子菜单添加“替换”动作replace->setIcon(QIcon(":/images/replace.bmp")); // 设置图标replace->setShortcut(QKeySequence::Replace); // 设置快捷键 Ctrl+Hconnect(close, &QAction::triggered, [this]() // 连接关闭动作的触发信号{this->close(); // 当点击“关闭”或按快捷键时,关闭窗口});
}
🌟 总结
菜单栏层次结构:
菜单栏 QMenuBar├─ 文件(&F)│ ├─ 打开文件 (Ctrl+O)│ └─ 关闭 (Ctrl+W)└─ 编辑(&E)└─ 查找/替换(&R)├─ 查找 (Ctrl+F)└─ 替换 (Ctrl+H)
- QMenu → 菜单
- QAction → 菜单项(可以有图标、快捷键、触发操作)
- &字母 → 设置菜单的 Alt 快捷键(例如
&F
→ Alt+F 打开文件菜单) - connect(close, &QAction::triggered, …) → 当用户点击菜单项或按快捷键时执行槽函数
3、可视化的方式创建菜单
(1)新建项目
双击mainwindow.ui,在出现的窗口设计界面中会发现顶部有两行,第一行是菜单栏。
双击在这里输入
,输入菜单名,然后回车。同时会出现下拉菜单,定位到下拉菜单上并双击,可以继续输入子菜单项名。
origin_url=C%3A%5CUsers%5C21145%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20250824184134355.png&pos_id=img-cZr7jpfu-1756952197703)
(2)添加槽函数
选择action,右键转到槽。
二、工具栏
工具栏通常位于菜单栏的下方,工具栏(
QToolBar
)是一个用于集中放置操作按钮和工具的区域,为用户提供了一种快速访问常用功能的方式。
1、创建工具栏
(1)启动Qt Creator,新建MainWindow项目,创建QToolBar工具栏对象
QToolBar *toolbar = new QToolBar;
this->addToolBar(toolbar); //this是QMainWindow对象实例
2、添加动作
向工具栏添加QAction
:
QAction* create = new QAction(QIcon(":images/open.bmp"), "新建文件(&N)", this);
// 创建一个 QAction 动作,带图标 ":images/open.bmp",文字为“新建文件(&N)”
// &N 表示菜单或工具提示的快捷键 Alt+N,this 是父对象create->setShortcut(QKeySequence::New);
// 设置快捷键为 Ctrl+N(QKeySequence::New 是 Qt 预定义的“新建”快捷键)toolBar->addAction(create);
// 将 create 动作添加到工具栏 toolBar 上,使它显示为工具按钮connect(create, &QAction::triggered, this, [=](){ edit->clear();
});
// 连接动作的 triggered 信号,当点击工具按钮或按快捷键时执行 lambda
// lambda 中的操作是清空 edit(通常是 QTextEdit 或 QLineEdit 控件)
示例:
头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QAction> // QAction 类,用于菜单项、工具栏动作
#include <QMainWindow> // QMainWindow 类,主窗口基类
#include <QPlainTextEdit> // QPlainTextEdit 类,多行文本编辑控件QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow; // UI 类声明(由 Qt Designer 生成的 ui_MainWindow.h)
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECT // Qt 元对象宏,支持信号与槽机制public:MainWindow(QWidget *parent = nullptr); // 构造函数,父控件可选~MainWindow(); // 析构函数public slots:void on_action_bold_triggered(bool); // 槽函数:响应“加粗”动作void on_action_itlalics_triggered(bool); // 槽函数:响应“斜体”动作void on_action_underline_triggered(bool);// 槽函数:响应“下划线”动作private:Ui::MainWindow *ui; // 指向 UI 界面的指针QPlainTextEdit *edit; // 文本编辑控件指针QAction *create; // “新建文件”动作指针QAction *bold; // “加粗”动作指针QAction *underLine; // “下划线”动作指针QAction *italics; // “斜体”动作指针
};#endif // MAINWINDOW_H
(3)创建工具栏
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QToolBar>
#include <QDebug>
#include <QPlainTextEdit>
#include <QWidget>
#include <QVBoxLayout>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this); // 初始化 UI 界面QToolBar* toolBar = this->addToolBar("toolbar"); // 创建工具栏,并添加到主窗口create = new QAction(QIcon(":images/open.bmp"), "新建文件", this); // 创建“新建文件”动作,带图标bold = new QAction(QIcon(":images/b.bmp"), "加粗", this); bold->setCheckable(true); // 设置为可切换状态(按下/弹起)italics = new QAction(QIcon(":images/i.bmp"), "斜体", this); italics->setCheckable(true); // 可切换状态underLine = new QAction(QIcon(":images/u.bmp"), "下划线", this); underLine->setCheckable(true); // 可切换状态toolBar->addAction(create); // 将“新建文件”动作添加到工具栏toolBar->addAction(bold); // 将“加粗”动作添加到工具栏toolBar->addAction(italics); // 将“斜体”动作添加到工具栏toolBar->addAction(underLine);// 将“下划线”动作添加到工具栏QWidget *center = this->centralWidget(); // 获取主窗口的中心部件(central widget)QVBoxLayout *layout = new QVBoxLayout(center); // 在中心部件上创建垂直布局管理器,使控件按垂直顺序排列edit = new QPlainTextEdit(center); // 创建多行纯文本编辑控件,父控件是中心部件layout->addWidget(edit); // 将文本编辑控件加入布局中connect(create, &QAction::triggered, this, [=](){edit->clear(); }); // 当点击“新建文件”动作或按快捷键时,清空文本编辑器connect(bold, &QAction::triggered, this, &MainWindow::on_action_bold_triggered); // 点击或切换“加粗”动作时,调用槽函数处理加粗逻辑connect(italics, &QAction::triggered, this, &MainWindow::on_action_itlalics_triggered); // 点击或切换“斜体”动作时,调用槽函数处理斜体逻辑connect(underLine, &QAction::triggered, this, &MainWindow::on_action_underline_triggered); // 点击或切换“下划线”动作时,调用槽函数处理下划线逻辑
}
(4)槽函数实现
void MainWindow::on_action_bold_triggered(bool checked)
{QTextCharFormat fmt = edit->currentCharFormat(); // 获取当前文本编辑框中选定文本的字符格式if(checked)fmt.setFontWeight(QFont::Bold); // 设置字体权重为粗体elsefmt.setFontWeight(QFont::Normal); // 设置字体权重为正常(取消加粗)edit->mergeCurrentCharFormat(fmt); // 将修改后的字符格式应用到当前选定文本,实现加粗或取消加粗
}void MainWindow::on_action_itlalics_triggered(bool checked)
{QTextCharFormat fmt = edit->currentCharFormat(); // 获取当前文本编辑框中选定文本的字符格式fmt.setFontItalic(checked); // 根据勾选状态设置斜体(checked为true则斜体,false取消斜体)edit->mergeCurrentCharFormat(fmt); // 将修改后的字符格式应用到当前选定文本
}void MainWindow::on_action_underline_triggered(bool checked)
{QTextCharFormat fmt = edit->currentCharFormat(); // 获取当前文本编辑框中选定文本的字符格式fmt.setFontUnderline(checked); // 根据勾选状态设置下划线(checked为true则显示下划线,false取消下划线)edit->mergeCurrentCharFormat(fmt); // 将修改后的字符格式应用到当前选定文本
}
3、可视化方式添加工具栏
(1)启动Qt Creator,新建项目
(2)创建资源文件
(3)以可视化的方式新建工具栏按钮
- 新建Action
- 为Action设置图标
- 将Action拖放到工具栏
(4)添加槽函数
右击名称
下的action,在弹出的菜单中选择转到槽
。添加信号槽函数。
(5)运行
4、QToolButton
QToolButton
是一个可视化的按钮控件,通常用于工具栏中,作为快捷按钮使用。和普通按钮不同,通常不显示文本,而显示图标。
使用 QToolButton
的基本步骤:
(1)创建 QToolButton
实例
创建一个 QToolButton
实例。可以在主窗口或任何适当的容器中完成。
QToolButton *toolButton = new QToolButton(this);
(2)设置图标和文本
可以为 QToolButton
设置图标和/或文本。图标通常用于提供视觉提示,而文本则提供额外的描述信息。
toolButton->setIcon(QIcon(":/icons/myicon.png")); // 设置图标t
toolButton->setText("My Tool Button"); // 设置文本
(3)设置按钮风格
该函数用于设置按钮的风格,比如只显示图标,只显示文本,或者文本位于图标旁边、下方等。
toolButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); // 设置文本显示在图标下方
参数style是要设置的风格,默认值是,Qt::ToolButtonIconOnly。Qt::ToolButtonStyle是枚举类型,取值如下:
常量 | 值 | 说明 |
---|---|---|
Qt::ToolButtonIconOnly | 0 | 只显示图标 |
Qt::ToolButtonTextOnly | 1 | 只显示文本 |
Qt::ToolButtonTextBesideIcon | 2 | 文本显示在图标旁边 |
Qt::ToolButtonTextUnderIcon | 3 | 文本显示在图标下边 |
(4)设置工具提示
为按钮添加工具提示(当用户将鼠标悬停在按钮上时显示的小文本框)
toolButton->setToolTip("This is a tool button"); // 设置工具提示
(5)设置按钮尺寸和样式
可以设置按钮的最小尺寸或启用/禁用文本显示
toolButton->setMinimumSize(QSize(32, 32)); // 设置最小尺寸
(6)连接信号和槽
为了响应用户的交互,需要将 QToolButton
的信号(如 clicked()
)连接到适当的槽函数。
connect(toolButton, &QToolButton::clicked, this, &MainWindow::onToolButtonClicked);
(7)将 QToolButton
添加到工具栏
使用 QToolBar
的 addWidget()
方法,添加到工具栏中。
toolBar->addWidget(toolButton); // 将QToolButton添加到工具栏中
三、状态栏
QStatusBar
是一个状态栏组件,位于窗口的底部,可以用来显示临时消息、操作提示、进度条等状态信息。
// 1、获取或创建状态栏对象
QStatusBar* statusBar = ui->statusbar; // 从 UI 界面获取状态栏指针// 2、显示临时文本消息
statusBar->showMessage("消息文本"); // 在状态栏显示一条消息,默认会在几秒后消失// 3、向状态栏添加自定义部件
QLabel *label = new QLabel("消息文本", this); // 创建一个 QLabel,用作状态栏显示文本
statusBar->addWidget(label); // 将 QLabel 添加到状态栏中(固定显示,不会自动消失)
- QStatusBar 位于窗口底部,用于显示临时提示信息或状态。
showMessage()
用于显示短期消息,适合提示操作结果。addWidget()
可以添加自定义控件(如 QLabel、进度条等),状态栏会一直显示这些控件