Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Admin от Сентябрь 25, 2006, 08:38



Название: Событие от мышки при наведении на кнопку
Отправлено: Admin от Сентябрь 25, 2006, 08:38
Возникла такая проблемка.
Если навестись мышкой на любую кнопку на форме или элемент, должно выскочить событие, по которому покажу справку на кнопку.

Как это реализовать?


Название: Событие от мышки при наведении на кнопку
Отправлено: Alexei от Сентябрь 25, 2006, 08:59
Похоже, кроме void mouseMoveEvent (QMouseEvent* event) ничего подходящего нет.


Название: Событие от мышки при наведении на кнопку
Отправлено: ElderOrb от Сентябрь 25, 2006, 10:21
может QWidget::setToolTip() для всех элементов формы  ?


Название: Событие от мышки при наведении на кнопку
Отправлено: Dendy от Сентябрь 25, 2006, 10:29
Смотреть:
QWidget::enterEvent()
QHoverEvent


Название: Событие от мышки при наведении на кнопку
Отправлено: Admin от Сентябрь 25, 2006, 11:27
mouseMoveEvent  замечетельно бы подошло
но там нет имени виджета от которого пришло!
хотелочь бы обрабатывать все в общем потоке

добавлено спустя 3 минуты:

 что хотелось бы

есть форма от дизайнера, не хотелось бы обрабатывать для каждой кнопки свое событие отдельно

а обрабатывать в общем потоке, сравнивая указатель на виджет


Название: Событие от мышки при наведении на кнопку
Отправлено: ElderOrb от Сентябрь 25, 2006, 11:49
Цитата: "Admin"
mouseMoveEvent  замечетельно бы подошло
но там нет имени виджета от которого пришло!
хотелочь бы обрабатывать все в общем потоке

добавлено спустя 3 минуты:

 что хотелось бы

есть форма от дизайнера, не хотелось бы обрабатывать для каждой кнопки свое событие отдельно

а обрабатывать в общем потоке, сравнивая указатель на виджет


В таком случае самое простое - это наставить на все виджэты фильтром какой-нить QObject и в eventFilter-е этого QObject-а поотлавливать всё о чём писал Dendy. Получится как раз всё в одном месте. А вместо имени виджэта для идентификации можно будет использовать objectName().


Название: Событие от мышки при наведении на кнопку
Отправлено: Mikhail от Сентябрь 25, 2006, 15:48
Если короткая справка, то устанавливай значение свойства ToolTip.
Очень просто в дизайнере или в интеграции.


Название: Событие от мышки при наведении на кнопку
Отправлено: Admin от Сентябрь 25, 2006, 17:22
да нет справка длинная

пользователь навел мышу на кнопку
и тут же на форме вывелось большой текст


Название: Событие от мышки при наведении на кнопку
Отправлено: Dendy от Сентябрь 25, 2006, 17:30
Ещё один некрасивьІй способ, но имеющий право на жизнь - создать свой стиль:

Код:
void MyStyle::polish( QWidget * widget )
{
  QPushButton * button = qobject_cast<QPushButton*>( widget );
  if ( button )
    button->installEventFilter( this );
}

bool MyStyle::eventFilter( QObject * o, QEvent * e )
{
  QPushButton * button = qobject_cast<QPushButton*>( o );
  if ( button && e->type() == QEvent::Hover )
  {
    // popup tip
  }
}


Ещё один способ - навешивать фильтр на родительский обьект и ловить QChildEvent. На пойманньІй дочерний обьект тоже вешаем фильтр. Дальше - то же самое: ловить QEvent::Hover от кнопок аль других виджетов, для которьІх нуна вьІводить подсказки.


Название: Событие от мышки при наведении на кнопку
Отправлено: yshurik от Сентябрь 25, 2006, 21:12
По поводу mouseMoveEvemt() - в Qt4 он будет работать при setMouseTracking(true);
(Это так, для справки)


Название: Событие от мышки при наведении на кнопку
Отправлено: bigirbis от Сентябрь 27, 2006, 10:07
Можно так:
Код:
QPushButton * button = new QPushButton( tr( "name" ), this );
button->setToolTip( tr( "Your text" ) );
button->installEventFilter( this );

Код:
eventFilter( QObject * object, QEvent * event )
{
 QWidget * widget = dynamic_cast < QWidget * > ( object );
 if ( widget && event->type() == QEvent::ToolTip )
 {
  QString tip = widget->toolTip();
 }
}

Потом уже можно месить что угодно...


Название: Событие от мышки при наведении на кнопку
Отправлено: Admin от Сентябрь 27, 2006, 10:53
да! такая простая задача, а сколько способов :)


Название: Событие от мышки при наведении на кнопку
Отправлено: bigirbis от Сентябрь 27, 2006, 11:10
Опыт показывает, что надо работать с QEvent::ToolTip - это поможет избежать мерцаний и написаний алгоритмов, которые уже давно реализованы (тем паче, что иначе придется QTimer подключать и пр.).