显示 QMenu 以响应 QLabel 中的右键单击,可能吗?
Posted
技术标签:
【中文标题】显示 QMenu 以响应 QLabel 中的右键单击,可能吗?【英文标题】:Show a QMenu in response to right click in a QLabel, possible? 【发布时间】:2016-03-12 22:40:19 【问题描述】:我正在考虑显示QMenu
以响应用户点击QLabel
。所以我尝试了:
菜单.h
#ifndef MENU_H
#define MENU_H
#include <QMenu>
class Menu : public QMenu
Q_OBJECT
public:
explicit Menu(QWidget *parent = 0);
signals:
public slots:
;
#endif // MENU_H
菜单.cpp
#include "menu.h"
Menu::Menu(QWidget *parent) :
QMenu(parent)
addAction("Action1");
应该调用的代码会显示菜单:
QLabel *label = new QLabel("...");
m_menu = new Menu;
label->setContextMenuPolicy(Qt::CustomContextMenu);
connect(label, &QLabel::customContextMenuRequested, m_menu, &Menu::activateWindow);
但它不起作用。我哪里错了?
【问题讨论】:
对 Labels 进行交互时要小心,因为这不是他们的设计并且违背了用户的期望。如果用户需要与 Label 交互,但不一定要编辑文本,那么只读 LineEdit 可能会更好。 【参考方案1】:试试这样:
菜单.h
#ifndef MENU_H
#define MENU_H
#include <QMenu>
class Menu : public QMenu
Q_OBJECT
public:
explicit Menu(QWidget *parent = 0);
signals:
public slots:
void showMenu(const QPoint &pos);
;
#endif // MENU_H
菜单.cpp
#include "menu.h"
Menu::Menu(QWidget *parent) :
QMenu(parent)
addAction("Action1");
Menu::showMenu(const QPoint &pos)
exec(mapToGlobal(pos));
这里是你的标签:
QLabel *label = new QLabel("...");
m_menu = new Menu;
label->setContextMenuPolicy(Qt::CustomContextMenu);
connect(label, SIGNAL(customContextMenuRequested(QPoint)), m_menu, SLOT(showMenu(QPoint)));
【讨论】:
太棒了。但是菜单出现在屏幕的左上角,而不是点击发生的位置。 请再检查一遍,我已经编辑过了。 exec(mapToGlobal(pos));【参考方案2】:首先,QWidget::customContextMenuRequested() 和 QWidget::activateWindow() 有不同的签名,即它们的参数不匹配。
其次,使用 QMenu::exec() 或 QMenu::popup() 方法而不是 activateWindow() 来显示 QMenu。
【讨论】:
以上是关于显示 QMenu 以响应 QLabel 中的右键单击,可能吗?的主要内容,如果未能解决你的问题,请参考以下文章
将项目添加到 AddIn 中的 Visual Studio 文件夹右键菜单