Russian Qt Forum
Октябрь 03, 2024, 09:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: События в делегате  (Прочитано 8500 раз)
GNU Dimarik
Гость
« : Ноябрь 30, 2009, 20:55 »

Всем привет.
Ломаю голову над тем,как обработать событие клика мышью на делегате.
Задача такая:
Есть наследник QTreeView который отображает модель ростера xmpp,на тайле есть кнопочка ткнув на которую тайл дожен открыться\закрыться.Как определить область на которую кликнул юзер?

Вот картинка https://url.odesk.com/cdqop
Помогите ПЛЗ!!!!!!
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Ноябрь 30, 2009, 21:09 »

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

Юра.
GNU Dimarik
Гость
« Ответ #2 : Ноябрь 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
Записан
GNU Dimarik
Гость
« Ответ #3 : Ноябрь 30, 2009, 21:17 »

Забыл сказать виджет я сделал в дизайнере,в общем то линивый дважды делает Грустный ... ,но если знаешь  способ подскажи плз
Записан
GNU Dimarik
Гость
« Ответ #4 : Ноябрь 30, 2009, 21:33 »

Видимо придется мне рендерить все ручками
В любом случае lit-uriy спасибо за внимание  Улыбающийся
Записан
crossly
Гость
« Ответ #5 : Декабрь 02, 2009, 17:14 »

а если просто переопределить event(QEvent *) у делегата.... или я чего то не понимаю ??
Записан
GNU Dimarik
Гость
« Ответ #6 : Декабрь 02, 2009, 17:42 »

Координаты я получаю переопределяя QTreeView::mousePressEvent(QMouseEvent *event).Дело в том,что я не могу потом получить координаты нужной области на виджете,потому,что для этого нужно его показать (QWidget::show()).
Решение нешел,я ручками рисую и сохраняю отрисованные области внутри делегата в объектах QRect.
Дальше получая координаты клика буду проверять входит ли точка клика в нужную область.
Тут возник вопрос,мне нужно выкидывать ТулТипы при наведении на те или иные части тайла,я переопределил QAbstractItemDelegate::helpEvent,вернул true,но не понимаю как технически отобразить тул тип,нарисовать? или отправить событие представлению?
Всем спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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