2011-01-24 149 views
5

我已经添加了一个标签作为图像(图标)到Qt中的一个小部件。 我想在用户单击标签上的(左键或右键单击)时显示弹出式菜单。 我该如何做到这一点?请帮助...Qt - 弹出菜单

+1

你想要什么确切:一个弹出菜单,当请求上下文菜单(右击),或一个弹出菜单,只要标签被点击时,不管它的左边或右边的按钮? – 2011-01-24 06:34:19

回答

6

您需要设置小部件的​​,然后将customContextMenuRequested事件连接到某个显示菜单的插槽。

参见:Qt and context menu

4

如果你想显示每当标签点击(与任何鼠标按钮)的上下文菜单,我想你必须实现自己的Label类,继承QLabel和处理弹出在鼠标事件的情况下,您自己的菜单。

这是一个非常简单(但工作)版本:

class Label : public QLabel 
{ 
public: 
    Label(QWidget* pParent=0, Qt::WindowFlags f=0) : QLabel(pParent, f) {}; 
    Label(const QString& text, QWidget* pParent = 0, Qt::WindowFlags f = 0) : QLabel(text, pParent, f){}; 

protected : 
    virtual void mouseReleaseEvent (QMouseEvent * ev) { 
     QMenu MyMenu(this); 
     MyMenu.addActions(this->actions()); 
     MyMenu.exec(ev->globalPos()); 
    } 
}; 

本专业Label类将在弹出菜单中添加到它的所有行动显示。 。

比方说,你的应用程序的主窗口被称为MainFrm并显示标签(label这是构造函数是什么样子:

MainFrm::MainFrm(QWidget *parent) : MainFrm(parent), ui(new Ui::MainFrm) 
{ 
    ui->setupUi(this); 

    QAction* pAction1 = new QAction("foo", ui->label); 
    QAction* pAction2 = new QAction("bar", ui->label); 
    QAction* pAction3 = new QAction("test", ui->label); 
    ui->label->addAction(pAction1); 
    ui->label->addAction(pAction2); 
    ui->label->addAction(pAction3); 
    connect(pAction1, SIGNAL(triggered()), this, SLOT(onAction1())); 
    connect(pAction2, SIGNAL(triggered()), this, SLOT(onAction2())); 
    connect(pAction3, SIGNAL(triggered()), this, SLOT(onAction3())); 
} 
0

如果标签是点击,这在逻辑上是一个“文本按钮“而不是” 标签“了。

我会建议使用QToolButton代替,并使用QSS弥补工具按钮的标签。

#define SS_TOOLBUTTON_TEXT(_normal, _hover, _disabled) \ 
    "QToolButton" "{" \ 
    "background:transparent" \ 
    "color:" #_normal ";" \ 
    "}" \ 
    "QToolButton:hover" "{" \ 
    "color:" #_hover ";" \ 
    "}" \ 
    "QToolButton:disabled" "{" \ 
    "color:" #_disabled ";" \ 
    "}" 

.... 

QToolButton *b = new QToolButton; { 
    b->setToolButtonStyle(Qt::ToolButtonTextOnly); 
    b->setStyleSheet(SS_TOOLBUTTON_TEXT(blue, red, gray)); 
    b->setText(QString("[%1]").arg(tr("menu")); 
} 
b->setMenu(menu_to_popup); 
connect(b, SIGNAL(clicked()), b, SLOT(showMenu()));