Qt菜单栏


Qt 窗口是通过 QMainWindow类 来实现的

img

创建菜单栏

Qt 中的菜单栏是通过 QMenuBar 这个类来实现的,一个窗口最多只有一个菜单栏。

菜单栏包含了菜单,而菜单又包含了菜单项

img

上图可以看出,菜单里面不只是可以包含菜单项,也可以包含菜单,这种被菜单包含的菜单成为子菜单

可以有两种方式创建菜单栏:

QMenuBar *menuBar = new QMenuBar();
this->setMenuBar(menuBar);
QMenuBar *menuBar = this->menuBar();
this->setMenuBar(menuBar);

对于菜单栏而言,在QMainWindow类对象被创建出来时默认是自动生成了一个菜单栏的。

因此对于第一种方式而言:通过重新new出来一个 QMenuBar 对象再赋值给 this,这种方式就会导致 this 默认自动生成的菜单栏被挤出对象树,这种情况就会导致找不到默认的菜单栏从而无法释放。虽然对于客户端而言这一点点的泄漏问题可以不会很大,但是还是做到尽量完美。

对于第二种方式而言:this->menuBar() 会有两种情况:当 this 没有菜单栏时会自动生成一个菜单栏;当 this 有菜单栏时就获取已有的菜单栏。所以第二种方式就不会多生成出额外的菜单栏对象,也就不会出现内存泄漏的情况。

创建菜单并在菜单栏中添加

菜单的类型为 QMenu,菜单栏通过 addMenu 函数去添加菜单

// 创建菜单
// (&?):设置快捷键(?可以是任一字母)
// 菜单的快捷键需要搭配 alt 键使用
QMenu *m1 = new QMenu("文件(&F)");
QMenu *m2 = new QMenu("编辑(&E)");
QMenu *m3 = new QMenu("构建(&B)");

// 将菜单加到菜单栏
menuBar->addMenu(m1);
menuBar->addMenu(m2);
menuBar->addMenu(m3);

img

创建子菜单并添加到菜单

添加子菜单的方式:先创建出需要的子菜单(子菜单也是菜单,也是 QMenu 类型),然后菜单可以通过 addMenu 函数添加子菜单。

// 创建子菜单
QMenu *c1 = new QMenu("最近打开文件");
// 将子菜单加到菜单
m1->addMenu(c1);

img

创建菜单项并在菜单中添加

在 Qt 中并没有专门的菜单项类,可以通过 QAction 类抽象出公共的动作。

菜单项也可以为自己添加图标,setIcon(QIcon *)

// 创建菜单项
### 如何在Qt中创建和自定义菜单栏Qt框架中,菜单栏(`QMenuBar`)的创建和自定义可以通过多种方式实现。以下将详细介绍如何使用PyQt结合Qt Designer以及纯代码实现菜单栏的设计与功能绑定。 #### 1. 使用PyQtQt Designer创建菜单栏 通过PyQtQt Designer可以快速可视化地设计用户界面,包括菜单和菜单栏。以下是具体步骤[^1]: - 在Qt Designer中拖拽一个`QMenuBar`到主窗口上。 - 添加菜单项(如“文件”、“编辑”等)并为其添加菜单(如“打开”、“保存”等)。 - 将每个菜单项或菜单项与特定的槽函数连接起来,例如`openFileWindow()`。 - 生成UI文件后,使用`pyuic5`工具将其转换为Python代码。 ```python from PyQt5 import QtWidgets, uic class MainWindow(QtWidgets.QMainWindow): def __init__(self): super().__init__() uic.loadUi("main_window.ui", self) # 加载由Qt Designer生成的UI文件 self.pMenuBar = self.menuBar() # 获取菜单栏对象 self.pMenuTest = self.pMenuBar.addMenu("测试") # 添加菜单 self.pActionTest = QtWidgets.QAction("操作1", self) # 创建动作 self.pMenuTest.addAction(self.pActionTest) # 将动作添加到菜单中 self.pActionTest.triggered.connect(self.openFileWindow) # 绑定槽函数 def openFileWindow(self): print("打开文件窗口") if __name__ == "__main__": app = QtWidgets.QApplication([]) window = MainWindow() window.show() app.exec_() ``` #### 2. 纯代码实现菜单栏 如果选择不使用Qt Designer,可以直接通过代码创建菜单栏。以下是一个示例[^2]: ```cpp #include "mainwindow.h" #include <QMenuBar> #include <QMenu> #include <QAction> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // 创建菜单栏 pMenuBar = new QMenuBar(this); setMenuBar(pMenuBar); // 创建菜单项 pMenuTest = new QMenu("测试", this); pMenuBar->addMenu(pMenuTest); // 创建菜单动作 pActionTest = new QAction("操作1", this); pActionTest1 = new QAction("操作2", this); // 将动作添加到菜单中 pMenuTest->addAction(pActionTest); pMenuTest->addAction(pActionTest1); // 连接信号与槽 connect(pActionTest, &QAction::triggered, this, &MainWindow::openFileWindow); } void MainWindow::openFileWindow() { qDebug() << "打开文件窗口"; } ``` #### 3. 自定义右键菜单 除了标准的菜单栏,还可以通过重写`contextMenuEvent`方法或设置`customContextMenuPolicy`来实现右键菜单[^3]。 ##### 方法一:重写`contextMenuEvent` ```cpp void MainWindow::contextMenuEvent(QContextMenuEvent *event) override { QMenu menu(this); QAction *action1 = menu.addAction("操作1"); QAction *action2 = menu.addAction("操作2"); connect(action1, &QAction::triggered, this, &MainWindow::onAction1Triggered); connect(action2, &QAction::triggered, this, &MainWindow::onAction2Triggered); menu.exec(event->globalPos()); } ``` ##### 方法二:使用信号与槽 ```cpp ui->centralWidget->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->centralWidget, &QWidget::customContextMenuRequested, this, &MainWindow::onContextMenu); void MainWindow::onContextMenu(const QPoint &pos) { QMenu menu(this); QAction *action1 = menu.addAction("操作1"); QAction *action2 = menu.addAction("操作2"); connect(action1, &QAction::triggered, this, &MainWindow::onAction1Triggered); connect(action2, &QAction::triggered, this, &MainWindow::onAction2Triggered); menu.exec(mapToGlobal(pos)); } ``` ### 注意事项 - 在使用Qt Designer时,确保正确连接信号与槽,避免功能缺失。 - 自定义右键菜单时,注意区分`contextMenuEvent`和`customContextMenuPolicy`的适用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CHJBL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值