Russian Qt Forum

Qt => Model-View (MV) => Тема начата: GNU Dimarik от Ноябрь 30, 2009, 20:55



Название: События в делегате
Отправлено: GNU Dimarik от Ноябрь 30, 2009, 20:55
Всем привет.
Ломаю голову над тем,как обработать событие клика мышью на делегате.
Задача такая:
Есть наследник QTreeView который отображает модель ростера xmpp,на тайле есть кнопочка ткнув на которую тайл дожен открыться\закрыться.Как определить область на которую кликнул юзер?
(https://url.odesk.com/cdqop)
Вот картинка https://url.odesk.com/cdqop (https://url.odesk.com/cdqop)
Помогите ПЛЗ!!!!!!


Название: Re: События в делегате
Отправлено: lit-uriy от Ноябрь 30, 2009, 21:09
что такое "тайл" не знаю, но у события мышки можно спросить координаты курсора, а их сопоставить с элементом представления (стало быть с делегатом)


Название: Re: События в делегате
Отправлено: GNU Dimarik от Ноябрь 30, 2009, 21:15
Я дал ссылку на картинку где нарисован тайл с кнопкой.Дело в том,что я рисую виджет на пиксмапе,а потом рисую пиксмап в QItemDelegate::paint

Код:
void CRosterDelegate::paint(QPainter *painter,const QStyleOptionViewItem &option,const QModelIndex &index) const
{
    if (index.data(oDesk::ItemTypeRole).toInt() == oDesk::Tile) {
        painter->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::HighQualityAntialiasing);
        mpTile->setModelIndex(index);
        mpTile->setGeometry(option.rect);
        QPixmap pixmap(option.rect.size());
        mpTile->render(&pixmap);

        painter->drawPixmap(option.rect,pixmap);
    } else
        QItemDelegate::paint(painter,option,index);
}

Таким образом когда происходит клик,я ловлю событие само собой,но уже не могу поймать позицию кнопки,для того,что бы она была правильной виджет нужно показать,явно вызвать QWidget::show(),что невозможно,он мелькает.Я пробовал его двигать и делать рпозрачным,все равно заметно.
Понятно,что проблема решиться,если я все нарисую ручками,но не хотелось бы.
Вот ссылка погляди https://url.odesk.com/cdqop (https://url.odesk.com/cdqop)


Название: Re: События в делегате
Отправлено: GNU Dimarik от Ноябрь 30, 2009, 21:17
Забыл сказать виджет я сделал в дизайнере,в общем то линивый дважды делает :( ... ,но если знаешь  способ подскажи плз


Название: Re: События в делегате
Отправлено: GNU Dimarik от Ноябрь 30, 2009, 21:33
Видимо придется мне рендерить все ручками
В любом случае lit-uriy спасибо за внимание  :)


Название: Re: События в делегате
Отправлено: crossly от Декабрь 02, 2009, 17:14
а если просто переопределить event(QEvent *) у делегата.... или я чего то не понимаю ??


Название: Re: События в делегате
Отправлено: GNU Dimarik от Декабрь 02, 2009, 17:42
Координаты я получаю переопределяя QTreeView::mousePressEvent(QMouseEvent *event).Дело в том,что я не могу потом получить координаты нужной области на виджете,потому,что для этого нужно его показать (QWidget::show()).
Решение нешел,я ручками рисую и сохраняю отрисованные области внутри делегата в объектах QRect.
Дальше получая координаты клика буду проверять входит ли точка клика в нужную область.
Тут возник вопрос,мне нужно выкидывать ТулТипы при наведении на те или иные части тайла,я переопределил QAbstractItemDelegate::helpEvent,вернул true,но не понимаю как технически отобразить тул тип,нарисовать? или отправить событие представлению?
Всем спасибо.