显示 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 中的右键单击,可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

5.1 Qmenu菜单栏

将项目添加到 AddIn 中的 Visual Studio 文件夹右键菜单

WPF 根据指定条件显示或禁止listView中的每一项的右键菜单

UI 导航控制器中的右键未在 Monotouch 中显示

如何禁用html中的右键菜单? [复制]

opencv中的右键事件