Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Гурман от Июня 03, 2010, 15:17



Название: как отличить полезные айтемы QListWidget от скроллбара?
Отправлено: Гурман от Июня 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();

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

собственно слямзено отсюда (http://doc.qt.nokia.com/4.2/widgets-tooltips.html) - и все работает, пока... курсор не зависнет на скроллбаре этого списка, тут же слет, поскольку внутри itemAt()->text() там что-то не определено

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

наверно все алиментарно, просто устал под конец дня


Название: Re: как отличить полезные айтемы QListWidget от скроллбара?
Отправлено: BRE от Июня 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() : "хрен его знает, где сейчас этот курсор";
 
.................
 


Название: Re: как отличить полезные айтемы QListWidget от скроллбара?
Отправлено: Гурман от Июня 03, 2010, 15:31
ну так оно и было... уже в отладчике увидел... ;D


Название: падает в Qt при обработке события was: как отличить полезные айтемы QListWidget
Отправлено: Гурман от Июня 03, 2010, 15:50
но все равно ерунда какая-то происходит - если это мой айтем, я выдаю тултип, и сваливаю return true;, тут все хорошо

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

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

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


Название: Re: как отличить полезные айтемы QListWidget от скроллбара?
Отправлено: BRE от Июня 03, 2010, 16:13
Показывай весь обработчик.  ;)


Название: Re: как отличить полезные айтемы QListWidget от скроллбара?
Отправлено: Гурман от Июня 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) вызывать, завтра посмотрю


Название: Re: как отличить полезные айтемы QListWidget от скроллбара?
Отправлено: zenden от Июня 04, 2010, 00:34
да с   return QListWidget::event(event); не вылетает  :)


Название: Re: как отличить полезные айтемы QListWidget от скроллбара?
Отправлено: Гурман от Июня 04, 2010, 08:22
да, конечно

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

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