qt QMenu详解
1、概述
QMenu是Qt框架中的一个类,用于创建和管理菜单。它提供了丰富的接口来添加菜单项(通常是QAction对象)、子菜单以及分隔符。QMenu可以嵌入到菜单栏(QMenuBar)中,也可以作为弹出菜单(通过调用exec()方法)使用。QMenu支持嵌套菜单,即菜单项本身可以是一个子菜单,从而创建出复杂的菜单结构。
QMenu不仅支持文本菜单项,还支持图标、快捷键和状态提示等功能,这些都可以通过QAction来设置。此外,QMenu还提供了对菜单项可见性、启用/禁用状态以及检查状态(checkable)的细粒度控制。
2、重要方法
- addAction(QAction *action):向菜单中添加一个动作。
- addMenu(QMenu *menu):向菜单中添加一个子菜单。
- addSeparator():在菜单中添加一个分隔符。
- clear():清除菜单中的所有项。
- exec(const QPoint &pos = QPoint()):在指定位置显示菜单作为弹出菜单,并返回用户选择的动作的索引(或-1如果没有选择)。
- setDefaultAction(QAction *action):设置菜单的默认动作,当用户按下回车键时触发。
- setTitle(const QString &title):设置菜单的标题。
- actions():返回菜单中所有动作的列表。
3、重要信号
- triggered(QAction *action):当菜单中的某个动作被触发时发出此信号。
- aboutToShow():在菜单即将显示之前发出此信号,可以用于动态调整菜单项。
- aboutToHide():在菜单即将隐藏之前发出此信号。
需要注意的是,QMenu本身并不直接处理用户输入,而是通过QAction来响应动作。因此,大多数与QMenu交互的信号和槽都是通过QAction来实现的。
#include <QApplication>
#include <QMainWindow>
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QMessageBox>
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
// 创建菜单栏
QMenuBar *menuBar = this->menuBar();
// 创建文件菜单
QMenu *fileMenu = menuBar->addMenu(tr("&File"));
// 创建动作
QAction *newAction = new QAction(tr("&New"), this);
newAction->setIcon(QIcon(":/icons/new.png"));
newAction->setStatusTip(tr("Create a new file"));
connect(newAction, &QAction::triggered, this, &MainWindow::onNewFile);
QAction *openAction = new QAction(tr("&Open..."), this);
openAction->setIcon(QIcon(":/icons/open.png"));
openAction->setStatusTip(tr("Open an existing file"));
connect(openAction, &QAction::triggered, this, &MainWindow::onOpenFile);
// 将动作添加到文件菜单
fileMenu->addAction(newAction);
fileMenu->addAction(openAction);
// 创建一个弹出菜单
QMenu *popupMenu = new QMenu(this);
QAction *exitAction = new QAction(tr("E&xit"), this);
exitAction->setStatusTip(tr("Exit the application"));
connect(exitAction, &QAction::triggered, qApp, &QApplication::quit);
popupMenu->addAction(exitAction);
QPushButton *btn = new QPushButton(this);
setCentralWidget(btn);
connect(btn, &QPushButton::clicked, this, [&, btn, popupMenu]
{
popupMenu->exec(btn->mapToGlobal(btn->rect().center()));
});
}
private slots:
void onNewFile() {
QMessageBox::information(this, tr("New File"), tr("Create a new file..."));
}
void onOpenFile() {
QMessageBox::information(this, tr("Open File"), tr("Open an existing file..."));
}
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MainWindow window;
window.show();
return app.exec();
}
觉得有帮助的话,打赏一下呗。。