0

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

此外,我正在为每个 设置状态提示,QAction当我将鼠标悬停在状态栏中时,它会出现在状态栏中,但即使在我关闭QMenu. 这是正常行为吗?

4

2 回答 2

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)应被覆盖的受保护函数,当在菜单中选择项目时,您将能够检测是否按下了鼠标左键或右键。

于 2010-12-24T21:54:44.617 回答
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();
}
于 2015-09-03T13:01:11.103 回答