Russian Qt Forum
Июнь 15, 2024, 21:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: как отличить полезные айтемы QListWidget от скроллбара?  (Прочитано 4395 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Июнь 03, 2010, 15:17 »

под конец рабочего дня моск уже плавится, не вижу, как сделать это...

есть список, унаследованный от QListWidget, отличается наличием обработчика клавиатуры, и обработчиком событий для реализации тултипа

начинается этот обработчик так:

Код:
bool MytListWidget::event( QEvent* event )
{
if( event->type() == QEvent::ToolTip )
{
QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event);
QString text = itemAt( helpEvent->pos() )->text();

................. и далее с полученной строкой что-то происходит, из чего получается тултип

собственно слямзено отсюда - и все работает, пока... курсор не зависнет на скроллбаре этого списка, тут же слет, поскольку внутри itemAt()->text() там что-то не определено

то есть, логично проверку сделать, не оказался ли кусрор над полезной строкой списка, вроде бы даже есть int QListWidgetItem::type () - но с чем его сравнивать? в список добавлялись честные QString, но целочисленного типа я в упор у QString не вижу...  Непонимающий

наверно все алиментарно, просто устал под конец дня
« Последнее редактирование: Июнь 03, 2010, 15:19 от Гурман » Записан

2^7-1 == 127, задумайтесь...
BRE
Гость
« Ответ #1 : Июнь 03, 2010, 15:24 »

Довольно опасная конструкция.
itemAt может спокойно вернуть 0, лучше это проверять.
Код
C++ (Qt)
bool MytListWidget::event( QEvent* event )
{
if( event->type() == QEvent::ToolTip )
{
QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event);
QTableWidgetItem *item =  itemAt( helpEvent->pos() );
QString text = item? item->text() : "хрен его знает, где сейчас этот курсор";
 
.................
 
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Июнь 03, 2010, 15:31 »

ну так оно и было... уже в отладчике увидел... Смеющийся
Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #3 : Июнь 03, 2010, 15:50 »

но все равно ерунда какая-то происходит - если это мой айтем, я выдаю тултип, и сваливаю return true;, тут все хорошо

но если не мой, я честно сваливаю в виде return QWidget::event(event); по понятным причинам, так и в примере написано

так вот, почему-то при скроллированнии вниз, когда скроллтаб упирается в нижний или верхний край, стабильно происходит падение где-то в потрохах Qt внутри этого обработчика, который я вызываю, в стеке видно множество внутренних вызовов

если отключаю свой обработчик event то все нормально работает
Записан

2^7-1 == 127, задумайтесь...
BRE
Гость
« Ответ #4 : Июнь 03, 2010, 16:13 »

Показывай весь обработчик.  Подмигивающий
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #5 : Июнь 03, 2010, 19:46 »

весь нет смысла, там чистая специфика, только выдача тултипа, а кроме этого ровно так:

Код:
bool MytListWidget::event( QEvent* event )
{
if( event->type() == QEvent::ToolTip )
{
QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event);
if( itemAt( helpEvent->pos() ) == 0 )
return QWidget::event(event);
QString text = itemAt( helpEvent->pos() )->text();
..... код формирования и выдачи тултипа, никакой связи с событиями
return true;
}
        return QWidget::event(event);
}

вот при вызове последнего event(event) где-то внутри Qt валится при обработке mouse wheel event

наверно надо QListWidget::event(event) вызывать, завтра посмотрю
« Последнее редактирование: Июнь 03, 2010, 19:53 от Гурман » Записан

2^7-1 == 127, задумайтесь...
zenden
Гость
« Ответ #6 : Июнь 04, 2010, 00:34 »

да с   return QListWidget::event(event); не вылетает  Улыбающийся
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #7 : Июнь 04, 2010, 08:22 »

да, конечно

конечно, вызывать обработчик события надо у того класса, который непосредственно наследован, поскольку классы в иерархии выше знать не знают что там ниже понавешано, соответственно QWidget ни сном, ни духом про какие-то скроллбары

/* просто под конец дня, после отладки нескольких сотен строк с нуля, моск уже сбоить начинает */
Записан

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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