在 Qt 框架中,QMenu 类用于创建和管理菜单。菜单是用户界面的一部分,可以包含多个选项或动作,用户可以选择这些选项来执行特定的功能。菜单通常显示在菜单栏、上下文菜单(右键菜单)或工具栏中。
基本用法
创建菜单对象:
QMenu *menu = new QMenu(this); // 创建一个新的 QMenu 对象,父对象为当前小部件
添加动作:
使用 addAction 方法将 QAction 对象添加到菜单中。QAction 代表菜单中的一个选项或动作。
QAction *action1 = new QAction("Action 1", this);
menu->addAction(action1); // 将动作添加到菜单
显示菜单:
菜单可以在指定的位置显示,例如在鼠标光标位置。
menu->exec(QCursor::pos()); // 在当前光标位置显示菜单
widget.h
#pragma once
#include <QtWidgets/QWidget>
#include "ui_widget.h"
#include <QMenu>
class widget : public QWidget
{
Q_OBJECT
public:
widget(QWidget *parent = nullptr);
~widget();
void contextMenuEvent(QContextMenuEvent* event) override;
void initMenu();
private:
Ui::widgetClass ui;
QMenu* m_pMenu = nullptr;
};
widget.cpp
#include "widget.h"
#include <QAction>
#include <QMessageBox>
widget::widget(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
this->setContextMenuPolicy(Qt::DefaultContextMenu);
initMenu();
}
widget::~widget()
{}
void widget::contextMenuEvent(QContextMenuEvent* event) {
m_pMenu->exec(QCursor::pos());
}
void widget::initMenu() {
m_pMenu = new QMenu(this);
QAction* pAc1 = new QAction("ac1");
QAction* pAc2 = new QAction("ac2");
QAction* pAc3 = new QAction("ac3");
QAction* pAc4 = new QAction("ac4");
QAction* pAc5 = new QAction("ac5");
QAction* pAc6 = new QAction("ac6");
QAction* pAc7 = new QAction("ac7");
m_pMenu->addAction(pAc1);
m_pMenu->addAction(pAc2);
m_pMenu->addAction(pAc3);
m_pMenu->addAction(pAc4);
m_pMenu->addAction(pAc5);
m_pMenu->addAction(pAc6);
m_pMenu->addAction(pAc7);
connect(pAc1, &QAction::triggered, [=] {
QMessageBox::information(this, "title", "ac1");
});
connect(pAc2, &QAction::triggered, [=] {
QMessageBox::information(this, "title", "ac2");
});
connect(pAc3, &QAction::triggered, [=] {
QMessageBox::information(this, "title", "ac3");
});
connect(pAc4, &QAction::triggered, [=] {
QMessageBox::information(this, "title", "ac4");
});
connect(pAc5, &QAction::triggered, [=] {
QMessageBox::information(this, "title", "ac5");
});
connect(pAc6, &QAction::trigger, [=] {
QMessageBox::information(this, "title", "ac6");
});
connect(pAc7, &QAction::trigger, [=] {
QMessageBox::information(this, "title", "ac7");
});
}
复盘
#include "widget.h"
#include <QAction>
#include <QMessageBox>
widget::widget(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
// 设置上下文菜单策略为默认
this->setContextMenuPolicy(Qt::DefaultContextMenu);
initMenu(); // 初始化菜单
}
widget::~widget()
{}
void widget::contextMenuEvent(QContextMenuEvent* event) {
m_pMenu->exec(QCursor::pos()); // 在光标位置执行菜单
}
void widget::initMenu() {
m_pMenu = new QMenu(this); // 创建新的QMenu
QAction* pAc1 = new QAction("ac1"); // 创建动作ac1
QAction* pAc2 = new QAction("ac2"); // 创建动作ac2
QAction* pAc3 = new QAction("ac3"); // 创建动作ac3
QAction* pAc4 = new QAction("ac4"); // 创建动作ac4
QAction* pAc5 = new QAction("ac5"); // 创建动作ac5
QAction* pAc6 = new QAction("ac6"); // 创建动作ac6
QAction* pAc7 = new QAction("ac7"); // 创建动作ac7
m_pMenu->addAction(pAc1); // 将动作ac1添加到菜单
m_pMenu->addAction(pAc2); // 将动作ac2添加到菜单
m_pMenu->addAction(pAc3); // 将动作ac3添加到菜单
m_pMenu->addAction(pAc4); // 将动作ac4添加到菜单
m_pMenu->addAction(pAc5); // 将动作ac5添加到菜单
m_pMenu->addAction(pAc6); // 将动作ac6添加到菜单
m_pMenu->addAction(pAc7); // 将动作ac7添加到菜单
// 连接动作ac1的触发信号到槽函数,显示信息框
connect(pAc1, &QAction::triggered, [=] {
QMessageBox::information(this, "title", "ac1");
});
// 连接动作ac2的触发信号到槽函数,显示信息框
connect(pAc2, &QAction::triggered, [=] {
QMessageBox::information(this, "title", "ac2");
});
// 连接动作ac3的触发信号到槽函数,显示信息框
connect(pAc3, &QAction::triggered, [=] {
QMessageBox::information(this, "title", "ac3");
});
// 连接动作ac4的触发信号到槽函数,显示信息框
connect(pAc4, &QAction::triggered, [=] {
QMessageBox::information(this, "title", "ac4");
});
// 连接动作ac5的触发信号到槽函数,显示信息框
connect(pAc5, &QAction::triggered, [=] {
QMessageBox::information(this, "title", "ac5");
});
// 连接动作ac6的触发信号到槽函数,显示信息框
connect(pAc6, &QAction::trigger, [=] {
QMessageBox::information(this, "title", "ac6");
});
// 连接动作ac7的触发信号到槽函数,显示信息框
connect(pAc7, &QAction::trigger, [=] {
QMessageBox::information(this, "title", "ac7");
});
}
setContextMenuPolicy
setContextMenuPolicy
是 Qt 中 QWidget 类的一个函数,用于设置小部件的上下文菜单策略。上下文菜单(也称为右键菜单)是用户通过右键单击触发的菜单。
Qt::ContextMenuPolicy
枚举定义了以下几种策略:
Qt::NoContextMenu: 禁用上下文菜单。
Qt::PreventContextMenu: 禁用默认上下文菜单,但仍然会触发 contextMenuEvent。
Qt::DefaultContextMenu: 使用 QWidget 的默认上下文菜单处理。
Qt::ActionsContextMenu: 显示与 QWidget 关联的动作(QAction)。
Qt::CustomContextMenu: 触发 customContextMenuRequested 信号,用户可以连接自己的槽函数来处理。
this->setContextMenuPolicy(Qt::DefaultContextMenu);
设置了默认的上下文菜单策略,即当用户右键单击小部件时,会触发 contextMenuEvent
函数。你可以在这个事件处理函数中自定义上下文菜单的行为,如下所示:
void widget::contextMenuEvent(QContextMenuEvent* event) {
m_pMenu->exec(QCursor::pos()); // 在光标位置显示菜单
}
通过这个设置,你可以为小部件提供自定义的上下文菜单,而不是依赖于系统的默认菜单。
QAction 和 QMenu
QAction 和 QMenu 是 Qt 框架中用于创建和管理菜单项的类。
QAction* pAc1 = new QAction("ac1");
这行代码创建了一个新的 QAction 对象。QAction 表示一个动作,可以被用户在菜单、工具栏或快捷键中触发。构造函数接受一个字符串参数作为动作的文本标签。
QAction 构造函数: QAction(const QString &text, QObject *parent = nullptr)
text: 动作的标签文本。在这个例子中,标签是 “ac1”。
parent: 动作的父对象。这里没有指定父对象,默认值为 nullptr。
QAction* pAc1 = new QAction("ac1"); // 创建一个标签为“ac1”的新动作
m_pMenu->addAction(pAc1);
这行代码将先前创建的 QAction 对象 pAc1 添加到菜单 m_pMenu 中。QMenu 是 Qt 中用于创建菜单的类,addAction 函数用于向菜单中添加一个动作。
QMenu 函数: void addAction(QAction *action)
action: 要添加到菜单中的 QAction 对象。
m_pMenu->exec(QCursor::pos());
m_pMenu->exec(QCursor::pos());
是在 Qt 中显示上下文菜单的一种常见方式。
m_pMenu->exec(QCursor::pos());
m_pMenu:这是一个 QMenu 对象的指针,表示要显示的菜单。
exec():QMenu 类的成员函数,用于以模态方式显示菜单,并阻塞直到用户选择了菜单项或关闭了菜单。exec() 函数返回用户选择的 QAction 指针,如果用户没有选择任何项而是关闭了菜单,则返回 nullptr。
QCursor::pos():静态函数,返回当前鼠标光标的位置(以全局坐标系表示)。通过这个位置,可以在鼠标光标处显示菜单。
在上下文菜单事件中,我们通常会使用这行代码来显示上下文菜单:
void widget::contextMenuEvent(QContextMenuEvent* event) {
m_pMenu->exec(QCursor::pos()); // 在光标位置显示菜单
}
显示菜单:exec() 方法会在指定位置显示菜单。在这个例子中,QCursor::pos() 返回当前光标的位置,因此菜单会在鼠标光标处弹出。
阻塞调用:exec() 是一个阻塞调用,这意味着程序执行会暂停在这一行,直到用户在菜单中选择一个动作或关闭菜单。然后,exec() 将返回选择的 QAction 或 nullptr。
结尾
最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。
同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。
谢谢您的支持,期待与您在下一篇文章中再次相遇!