Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: SubaroMows от Март 08, 2011, 15:37



Название: Наведении мыши на объекты QMenu верхнего уровня.
Отправлено: SubaroMows от Март 08, 2011, 15:37
Доброго времени суток.
Есть стандартная программа со стандартным меню, при наведении мыши на элемент Action в меню, в строке состояния отображается подсказка, которая задаётся в рукопашную в поле statusTrip, как показано на рисунке.
 (http://imglink.ru/pictures/08-03-11/3cbf2dea730358d05e8e71b2f980734a.jpg) (http://imglink.ru)

Далее встала задача чтобы подсказки выводились для верхних меню:File, Edit, Help.
Пример на рисунке:
 (http://imglink.ru/pictures/08-03-11/3a725312f000418e9283dc668c5a7aa6.jpg) (http://imglink.ru)

Как ни странно но у них тоже есть поля statusStrip, но они не работают.
Стал искать окольные пути через eventFilter и mouseMoveEvent.
Первый вариант:
Код:
...
fileMenu = mainMenuBar->addMenu("File");
....
bool GlobalForm::eventFilter(QObject *obj, QEvent *evt)
{
    if(obj == fileMenu)
    {
        if(evt->type() == QEvent::Enter)
            QMessageBox::information(this,"Good test","Well, it is work.");
    }
    return QObject::eventFilter(obj,evt);
}
Сколько не крутил мышкой возле File, тестовое сообщение так и не выдало.
Второй вариант:
Предварительно установил setMouseTracking(true);
Код:
void GlobalForm::mouseMoveEvent(QMouseEvent* event)
{
    QPoint pos = event->pos();
    QString strX,strY;
    strX.setNum(pos.x());
    strY.setNum(pos.y());
    QPoint posTarget = mainMenuBar->mapToParent(QPoint(0,0));

    QString strX1,strY1;
    strX1.setNum(posTarget.x());
    strY1.setNum(posTarget.y());
    if(pos.x()>posTarget.x() && pos.x()<posTarget.x()+50 && pos.y()>posTarget.y() && pos.y()<posTarget.y()+30)
        QMessageBox::information(this,"",tr("\"%1").arg(strX1));
}

результат тоже 0.

Друзья помогите решить эту задачку, очень надо. Я уже отчаялся.


Название: Re: Наведении мыши на объекты QMenu верхнего уровня.
Отправлено: serg_hd от Март 09, 2011, 00:05
Может тогда поставить eventFilter на QMenuBar (которому ты скармливаешь QMenu) - он точно на Enter мыши реагирует - по его children() распознавать нужный QMenu и через QMainWindow>statusBar()->showMessage() показывать нужный текст в зависимости от конкретного QMenu?


Название: Re: Наведении мыши на объекты QMenu верхнего уровня.
Отправлено: GreatSnake от Март 09, 2011, 10:05
Цитировать
Как ни странно но у них тоже есть поля statusStrip, но они не работают.
Как ни странно, но всё работает:
Код
C++ (Qt)
fileMenu = mainMenuBar->addMenu("File");
fileMenu->menuAction()->setStatusTip( "This is the File menu bar item" );


Название: Re: Наведении мыши на объекты QMenu верхнего уровня.
Отправлено: serg_hd от Март 09, 2011, 22:51
Цитировать
Как ни странно но у них тоже есть поля statusStrip, но они не работают.
Как ни странно, но всё работает:
Код
C++ (Qt)
fileMenu = mainMenuBar->addMenu("File");
fileMenu->menuAction()->setStatusTip( "This is the File menu bar item" );

он видимо имел ввиду QMenu::setStatusTip(), а не QAction::setStatusTip(), хотя последнее и есть ответ на вопрос. Для каких тогда целей первый вариант?