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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сложный виждет в качестве делегата.  (Прочитано 5276 раз)
Barmaglodd
Гость
« : Март 02, 2010, 13:16 »

Есть сложный виджет с несколькими полями ввода и чем-то типа слайдера. Надо его использовать в качестве редактора в делегате. Необходимо, чтобы даже неактивная ячейка выглядела как этот виждет.
Отсюда 2 проблемы:
1. Как написать делегат, чтобы он корректно отображал неактивную ячейку? Сейчас вижу только мега костыль: создавать в методе paint делегата виджет, заполнять его руками и отрисовывать его копию. Причём ещё как-то надо обрабатывать изменение данных модели.
2. Даже выставив QAbstractItemView::AllEditTriggers, первый MousePressEvent съедается ItemView для перехода в режим редактирования. Например, не получится просто ткнуть в неактивную ячейку со слайдером и потянуть его, не отпуская левой кнопки мыши.
Записан
Павел_F.
Гость
« Ответ #1 : Март 02, 2010, 13:34 »

У делегата есть virtual bool   editorEvent ( QEvent * event, QAbstractItemModel * model, const QStyleOptionViewItem & option, const QModelIndex & index )  там и нужно обрабатывать события.
Советую посмотреть на пример (Путь до Qt)/examples/itemviews/stardelegate Там то что вам нужно.
Есть, из той же серии (Путь до Qt)/demos/books.
Там делегаты которых всегда видно и с обработкой событий.
« Последнее редактирование: Март 02, 2010, 13:36 от Павел_F. » Записан
Barmaglodd
Гость
« Ответ #2 : Март 02, 2010, 13:37 »

Ага, а потом посмотреть на входные параметры этого метода и понять, что виджета там нет. Как я ему перешлю событие?
Записан
Barmaglodd
Гость
« Ответ #3 : Март 02, 2010, 13:40 »

И StarDelegate страдает от той же болезни съедания первого события.
Записан
Павел_F.
Гость
« Ответ #4 : Март 02, 2010, 13:48 »

В код не вчитывался но books реагирует на 1-е событие нормально. Нажал мышью, звездочек прибавилось.
stardelegate по первому клику меняет выбранный элемент, если тыкать в уже выделенную строку то реагирует на первое событие.
А виджета там и не надо.
Забудьте про stardelegate там editorEvent как раз и не используется. Смотрите на books.
« Последнее редактирование: Март 02, 2010, 14:03 от Павел_F. » Записан
Barmaglodd
Гость
« Ответ #5 : Март 02, 2010, 14:07 »

В books в модель пишется, мне же надо именно событие передать. Попробуйте в books кликнуть по неактивной ячейке со звёздочками и, не отпуская левой кнопки мыши, подвигать мышь. Звёздочки не побегут за курсором, до них события не доходят.
Записан
Barmaglodd
Гость
« Ответ #6 : Март 02, 2010, 14:24 »

Как оказалось editorEvent вызывается ещё до createEditor. Видимо, моя таблица плавно превращается в GridLayout.
Записан
Павел_F.
Гость
« Ответ #7 : Март 02, 2010, 14:36 »

Попробуйте в books кликнуть по неактивной ячейке со звёздочками и, не отпуская левой кнопки мыши, подвигать мышь. Звёздочки не побегут за курсором, до них события не доходят.
В код books загляните
Код
C++ (Qt)
if (event->type() == QEvent::MouseButtonPress) {
       QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
       int stars = qBound(0, int(0.7 + qreal(mouseEvent->pos().x()
           - option.rect.x()) / star.width()), 5);
       model->setData(index, QVariant(stars));
       return false; //so that the selection can change
   }
с чего бы им на QEvent::MouseMove реагировать-то? реакция только на QEvent::MouseButtonPress написана, остальные лесом.
Записан
Павел_F.
Гость
« Ответ #8 : Март 02, 2010, 14:46 »

 А уж есть виджет или нет, найти его если надо это не проблема. Поставить флаг в createEditor, запомнить указатель на виджет, у closeEditor флаг убрать... Ну тут полно вариантов. Главное вам пришло то, что случилось, что нужно сообщить виджету.
Записан
SABROG
Гость
« Ответ #9 : Март 02, 2010, 20:15 »

openPersistentEditor() не подходит? Или вызов слота edit() по клику мышки?
Записан
Barmaglodd
Гость
« Ответ #10 : Март 03, 2010, 12:37 »

openPersistentEditor() самое оно. Огромное спасибо!!!!!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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