Qt中的上下文菜单 ContexMenu
2018-02-26 23:19:46 SallenKey 阅读数 549更多
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.youkuaiyun.com/xiaoyink/article/details/79382920
Qt实现上下文菜单
一、重载contextMenuEvent()事件处理函数,在重载的contextMenuEvent函数中显示QMenu对象:
widget.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
class QMenu;
class QAction;
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
protected:
void contextMenuEvent(QContextMenuEvent *event);
private:
Ui::Widget *ui;
QMenu * menu;
QAction * openAction;
QAction * saveAsAction;
};
#endif // WIDGET_H
widget.cpp文件
-
#include "widget.h" -
#include "ui_widget.h" -
#include <QMenu> -
#include <QAction> -
#include <QContextMenuEvent> -
Widget::Widget(QWidget *parent) : -
QWidget(parent), -
ui(new Ui::Widget), -
menu(new QMenu(this)), -
openAction(new QAction(QStringLiteral("打开"), this)), -
saveAsAction(new QAction(QStringLiteral("另存为"), this)) -
{ -
ui->setupUi(this); -
menu->addAction(openAction); -
menu->addAction(saveAsAction); -
} -
Widget::~Widget() -
{ -
delete ui; -
} -
void Widget::contextMenuEvent(QContextMenuEvent *event) -
{ -
//显示菜单到鼠标右击即event发生的坐标处,这两种写法都行,最终都是用全局坐标 -
//this->menu->exec(this->mapToGlobal(event->pos())); -
this->menu->exec(event->globalPos()); -
}
二、添加QAction对象到父窗口,即要设置上下文菜单的窗口,然后设置父窗口属性为Qt::ActionsContextMenu:
只需将Widget类的构造函数做如下更改,并去掉对contextMenuEvent函数的重载:
-
Widget::Widget(QWidget *parent) : -
QWidget(parent), -
ui(new Ui::Widget), -
menu(new QMenu(this)), -
openAction(new QAction(QStringLiteral("打开"), this)), -
saveAsAction(new QAction(QStringLiteral("另存为"), this)) -
{ -
ui->setupUi(this); -
//menu->addAction(openAction); -
//menu->addAction(saveAsAction); -
this->addAction(openAction); -
this->addAction(saveAsAction); -
this->setContextMenuPolicy(Qt::ActionsContextMenu); -
}
本文详细介绍了在Qt中实现上下文菜单的两种方法:通过重载contextMenuEvent事件处理函数和通过设置窗口属性为ActionsContextMenu。提供了具体的代码示例,包括如何创建QMenu对象和QAction对象,以及如何在鼠标右击时显示菜单。
596

被折叠的 条评论
为什么被折叠?



