如何让菜单点击后不消失

来源:互联网 发布:串行12864接单片机 编辑:程序博客网 时间:2024/05/02 02:51

本篇文章摘自 CSDN论坛区 allencui0313的帖子,为了以后用到时好找就收藏到自己的空间里。

http://bbs.csdn.net/topics/390276550


其实action的触发是由menu来控制的。当QMenu收到QMouseReleased事件后,会根据坐标找到当前的QAction并激发。然后自己隐藏。

因此重载菜单,重写mouseReleaseEvent,本篇文章是设置action的属性,根据设置的属性来控制行为。

#include "mymenu.h"
#include <QApplication>
#include <QDebug>
MyMenu::MyMenu(QWidget *parent) :
    QMenu(parent)
{
    //add action
    QAction *action1 = new QAction("1",this);
    QAction *action2 = new QAction("2",this);
    QAction *action3 = new QAction("3",this);
    QAction *action4 = new QAction("4",this);

    action1->setCheckable(true);
    action2->setCheckable(true);
    action3->setCheckable(true);
    action4->setCheckable(true);

    action1->setProperty("canHideMenu","true");
    action2->setProperty("canHideMenu","true");
    action3->setProperty("canHideMenu","false");
    action4->setProperty("canHideMenu","false");


    this->addAction(action1);
    this->addAction(action2);
    this->addAction(action3);
    this->addAction(action4);

}

void MyMenu::mouseReleaseEvent(QMouseEvent *e)
{

    QAction *action = this->actionAt(e->pos());
    if(action)
    {

        QString strCanHide = action->property("canHideMenu").toString();
        qDebug() << "MyMenu::mouseReleased: " << strCanHide;
        if(strCanHide == "true")
        {
            QMenu::mouseReleaseEvent(e);
            return;
        }
        else
        {
            action->activate(QAction::Trigger);
            return;
        }
    }
    QMenu::mouseReleaseEvent(e);

}