用于鼠标按键检测的自定义QAction / QMenu

时间:2010-12-24 21:00:14

标签: qt button mouse qmenu

我正在尝试创建一个弹出菜单,我可以在其中检测为给定项目按下的鼠标按钮。我已经创建了一个自定义QAction来构建我的QMenu,但是当按下菜单项时triggered信号没有提供QMouseEvent我查询按下按钮。

另外,我正在设置每个QAction的状态提示,当我将鼠标悬停在状态栏上时会显示状态提示,但是在我关闭QMenu后它仍然保持不变。这是正常的行为吗?

2 个答案:

答案 0 :(得分:3)

我不确定我是否明白你想要什么;但如果要在鼠标右键单击时显示弹出菜单,则应首先在窗口小部件(或窗口类)的头文件中覆盖与鼠标事件相关的函数,并声明一些将显示弹出菜单的函数。因此,头文件应包含以下声明:

...
void Popup(const QPoint& pt);
void mousePressEvent(QMouseEvent *event);
...

在函数的cpp文件定义中:

void testQt::mousePressEvent(QMouseEvent *event)
{
     if (event->button() == Qt::RightButton) {

         this ->Popup(event ->pos());
         event->accept();
     }
 }

void testQt::Popup(const QPoint& pt)
{
    QPoint global = this ->mapToGlobal(pt);
    QMenu* pPopup = new QMenu(this);

    QAction* pAction1 = new QAction("Item 1", this);
    QAction* pAction2 = new QAction("Item 2", this);
    pPopup ->addAction(pAction1);
    pPopup ->addAction(pAction2);

    QAction* pItem = pPopup ->exec(global);

    if(pItem == pAction1)
    {
    }
    else if(pItem == pAction2)
    {
    }
}

现在,当您按下鼠标右键时,光标位置会出现一个弹出菜单。 我希望这会有所帮助。

注意:如果要在选择操作时检测按下哪个鼠标按钮,则应从QMenu继承自己的类。 QMenu类包含受保护的函数mousePressEvent(QMouseEvent *event),应该覆盖它,并且当您在菜单中选择项目时,您将能够检测是否按下了鼠标左键。

答案 1 :(得分:1)

我知道这是一篇非常古老的帖子。但是,如果您想知道在弹出菜单/上下文菜单中单击了哪个按钮。 让我们说你按下保存按钮,它与信号和插槽等连接。在插槽中调用一个名为sender();的方法。这会返回QObject,您可以将其投射到QAction*并从中获取数据等。

void MyClass::showMenu()
{
     auto action(new QAction*("Blah", ui->my_toolbar));

     QObject::connect(action, &QAction::triggered, this, &MyClass::mySlot);
}

void MyClass::mySlot()
{
     auto myAction(static_cast<QAction*>(sender()));
     myAction->doAwesomeStuff();
}