【问题标题】:Show a QMenu in response to right click in a QLabel, possible?显示 QMenu 以响应 QLabel 中的右键单击,可能吗?
【发布时间】: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 可能会更好。

标签: c++ qt c++11 qt4 qt5


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-19
    • 2014-06-03
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多