Пользовательские QAction / QMenu для обнаружения кнопок мыши - PullRequest
0 голосов
/ 25 декабря 2010

Я пытаюсь создать всплывающее меню, где я могу обнаружить кнопку мыши, которая была нажата для данного элемента.Я уже создал пользовательский QAction для создания моего QMenu, но сигнал triggered при нажатии на пункт меню не дает мне QMouseEvent для запроса нажатой кнопки.

Кроме того, я устанавливаю подсказку о статусе для каждого QAction, которая появляется в строке состояния, когда я наводю на нее курсор, но остается даже после закрытия QMenu.Это нормальное поведение?

Ответы [ 2 ]

3 голосов
/ 25 декабря 2010

Я не уверен, понял ли я, что вы хотите;но если вы хотите отобразить всплывающее меню по щелчку правой кнопкой мыши, вы должны сначала в заголовочном файле вашего виджета (или класса окна) переопределить функцию, связанную с событием мыши, и объявить некоторую функцию, которая покажет ваше всплывающее меню.Итак, заголовочный файл должен содержать следующие объявления:

...
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 голос
/ 03 сентября 2015

Я знаю, что это очень старый пост. Но если вы хотите знать, на какую кнопку вы нажали во всплывающем меню / контекстном меню. Допустим, вы нажимаете кнопку Сохранить, это связано с сигналами, слотами и т. Д. В слоте вызывается метод с именем 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();
}
...