2014-11-27 4 views
6

Я хочу, чтобы показывать подсказки для QMenu элементов (QAction). Лучшее, что я достиг, чтобы соединить парил сигнал QAction на QTooltip шоу:QTooltip for QActions in QMenu

connect(action, &QAction::hovered, [=]{ 
    QToolTip::showText(QCursor::pos(), text, this); 
}); 

Проблема заключается в том, что иногда программа расположит подсказки ниже меню, особенно при изменении меню.

Есть ли способ заставить всплывающую подсказку показать сверху?

ответ

5

Вы можете создать подкласс QMenu и реализовав QMenu::event() перехватить QEvent::ToolTip событие и вызвать QToolTip::showText установить всплывающую подсказку для активного действия:

#include <QtGui> 

class Menu : public QMenu 
{ 
    Q_OBJECT 
public: 
    Menu(){} 
    bool event (QEvent * e) 
    { 
     const QHelpEvent *helpEvent = static_cast <QHelpEvent *>(e); 
     if (helpEvent->type() == QEvent::ToolTip && activeAction() != 0) 
     { 
       QToolTip::showText(helpEvent->globalPos(), activeAction()->toolTip()); 
     } else 
     { 
       QToolTip::hideText(); 
     } 
     return QMenu::event(e); 
    } 
}; 

Теперь вы можете использовать пользовательское меню, как:

Menu *menu = new Menu(); 
menu->setTitle("Test menu"); 
menuBar()->addMenu(menu); 

QAction *action1 = menu->addAction("First"); 
action1->setToolTip("First action"); 

QAction *action2 = menu->addAction("Second"); 
action2->setToolTip("Second action"); 
+0

Это именно то, что я искал. Благодарю. – Noel