【问题标题】:Custom QAction/QMenu for mouse button detection用于鼠标按钮检测的自定义 QAction/QMenu
【发布时间】:2016-04-13 05:37:14
【问题描述】:

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

另外,我为每个QAction 设置了一个状态提示,当我将鼠标悬停在它上面时,它会出现在状态栏中,但即使在我关闭QMenu 后它仍然存在。这是正常行为吗?

【问题讨论】:

    标签: qt button mouse qmenu


    【解决方案1】:

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

    ...
    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),它应该被覆盖,当您在菜单中选择一个项目时,您将能够检测是否按下了鼠标左键或右键。

    【讨论】:

    • 不,我可以得到弹出窗口。我想知道按下了哪个按钮来隐藏弹出窗口。
    • 选择的动作(项目)在以下行中定义:QAction* pItem = pPopup ->exec(global);我编辑了代码以使其更清晰。
    • 也许我还没有说清楚。我现在通过覆盖 mousePressEvent 弹出菜单,如果事件按钮是右键单击,我会弹出菜单。现在,假设我有一个像“保存图像...”这样的动作。我想知道用户点击它之后菜单会消失,他们是点击左键还是右键,因为他们会做两件不同的事情。
    【解决方案2】:

    我知道这是一篇很老的帖子。但是,如果您想知道在弹出菜单/上下文菜单中单击了哪个按钮。 假设您按下按钮保存,它与信号和插槽等连接。在插槽中调用一个名为 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();
    }
    

    【讨论】:

      猜你喜欢
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-04
      相关资源
      最近更新 更多