显示QMenu以响应QLabel中的右键单击,可能吗?

时间:2016-03-12 22:40:20

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

我正在考虑使用QMenu来回应用户点击QLabel。所以我试过了:

menu.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

menu.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);

但它不起作用。哪里我错了?

2 个答案:

答案 0 :(得分:3)

试试这样:

menu.h

print ("~ On Hand: " + str(onhand))

menu.cpp

#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

这是你的标签:

#include "menu.h"

Menu::Menu(QWidget *parent) :
    QMenu(parent)
{
    addAction("Action1");
}
Menu::showMenu(const QPoint &pos)
{
    exec(mapToGlobal(pos));
}

答案 1 :(得分:0)

首先,QWidget :: customContextMenuRequested()和QWidget :: activateWindow()具有不同的签名,即它们的参数不匹配。

其次,使用QMenu :: exec()或QMenu :: popup()方法显示QMenu而不是activateWindow()。