Russian Qt Forum
Ноябрь 24, 2024, 08:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Наведении мыши на объекты QMenu верхнего уровня.  (Прочитано 3192 раз)
SubaroMows
Гость
« : Март 08, 2011, 15:37 »

Доброго времени суток.
Есть стандартная программа со стандартным меню, при наведении мыши на элемент Action в меню, в строке состояния отображается подсказка, которая задаётся в рукопашную в поле statusTrip, как показано на рисунке.


Далее встала задача чтобы подсказки выводились для верхних меню:File, Edit, Help.
Пример на рисунке:


Как ни странно но у них тоже есть поля 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.

Друзья помогите решить эту задачку, очень надо. Я уже отчаялся.
« Последнее редактирование: Март 08, 2011, 15:57 от SubaroMows » Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #1 : Март 09, 2011, 00:05 »

Может тогда поставить eventFilter на QMenuBar (которому ты скармливаешь QMenu) - он точно на Enter мыши реагирует - по его children() распознавать нужный QMenu и через QMainWindow>statusBar()->showMessage() показывать нужный текст в зависимости от конкретного QMenu?
Записан

kubuntu/Win7/x64/NetBeans
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Март 09, 2011, 10:05 »

Цитировать
Как ни странно но у них тоже есть поля statusStrip, но они не работают.
Как ни странно, но всё работает:
Код
C++ (Qt)
fileMenu = mainMenuBar->addMenu("File");
fileMenu->menuAction()->setStatusTip( "This is the File menu bar item" );
Записан

Qt 5.11/4.8.7 (X11/Win)
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #3 : Март 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(), хотя последнее и есть ответ на вопрос. Для каких тогда целей первый вариант?
« Последнее редактирование: Март 09, 2011, 22:59 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.092 секунд. Запросов: 22.