Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] Наведении мыши на объекты QMenu верхнего уров


Автор: SubaroMows 8.3.2011, 15:55
Доброго времени суток. 
Есть стандартная программа со стандартным меню, при наведении мыши на элемент Action в меню, в строке состояния отображается подсказка, которая задаётся в рукопашную в поле statusTrip, как показано на рисунке.
http://imglink.ru

Далее встала задача чтобы подсказки выводились для верхних меню:File, Edit, Help. 
Пример на рисунке:
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.

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


Автор: _GRIN_ 18.3.2011, 18:11
Вообщем тебе надо глядеть имплементацию QMenuBar - куда айтемы добавляются - я тут глянул побыстрому - QMenu не получает ни eventInter(), ни underMouse() у него не работает (хотя курсор на надписи айтема) - судя по всему отображается только QMenuBar и просто использует данные от добавленных айтемов. Т.к. если добавить таймер в наследника QMenu и поглядеть его состояния следующим образом:
Код

void MenuItem::timeout() // class MenuItem : public QMenu
{
    qDebug() << "MenuItem::timeout(): " << isVisible() << underMouse() << rect();
}


то мы увидим, что изначально айтем невидим (хотя мы видим надпись (причём имеет какой-то очень уж большой размер):
Код

MenuItem::timeout():  false false QRect(0,0 640x480) 

кликнув на айтеме мы видим, что он стал видим, но его размер нулевой!!!
Код

MenuItem::timeout():  true false QRect(0,0 0x0) 

убрав выделение (перейдя на другой айтем) мы видим, что убрался только флаг видимости, размер остался нулевым
Код

MenuItem::timeout():  false false QRect(0,0 0x0)


естественно, что при нулевом размере мы никогда не получим событие eventEnter() и соответственно не отобразим сообщение в статусбаре

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)