Пользовательский Quction/Qmenu для обнаружения кнопок мыши

StackOverflow https://stackoverflow.com/questions/4528334

  •  13-10-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

...
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) который должен быть переопределен, и вы сможете обнаружить, если нажат кнопку левой или правой мыши, когда в вашем меню выбран элемент.

Другие советы

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