Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Barmaglodd от Март 02, 2010, 13:16



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


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


Название: Re: Сложный виждет в качестве делегата.
Отправлено: Barmaglodd от Март 02, 2010, 13:37
Ага, а потом посмотреть на входные параметры этого метода и понять, что виджета там нет. Как я ему перешлю событие?


Название: Re: Сложный виждет в качестве делегата.
Отправлено: Barmaglodd от Март 02, 2010, 13:40
И StarDelegate страдает от той же болезни съедания первого события.


Название: Re: Сложный виждет в качестве делегата.
Отправлено: Павел_F. от Март 02, 2010, 13:48
В код не вчитывался но books реагирует на 1-е событие нормально. Нажал мышью, звездочек прибавилось.
stardelegate по первому клику меняет выбранный элемент, если тыкать в уже выделенную строку то реагирует на первое событие.
А виджета там и не надо.
Забудьте про stardelegate там editorEvent как раз и не используется. Смотрите на books.


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


Название: Re: Сложный виждет в качестве делегата.
Отправлено: Barmaglodd от Март 02, 2010, 14:24
Как оказалось editorEvent вызывается ещё до createEditor. Видимо, моя таблица плавно превращается в GridLayout.


Название: Re: Сложный виждет в качестве делегата.
Отправлено: Павел_F. от Март 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 написана, остальные лесом.


Название: Re: Сложный виждет в качестве делегата.
Отправлено: Павел_F. от Март 02, 2010, 14:46
 А уж есть виджет или нет, найти его если надо это не проблема. Поставить флаг в createEditor, запомнить указатель на виджет, у closeEditor флаг убрать... Ну тут полно вариантов. Главное вам пришло то, что случилось, что нужно сообщить виджету.


Название: Re: Сложный виждет в качестве делегата.
Отправлено: SABROG от Март 02, 2010, 20:15
openPersistentEditor() не подходит? Или вызов слота edit() по клику мышки?


Название: Re: Сложный виждет в качестве делегата.
Отправлено: Barmaglodd от Март 03, 2010, 12:37
openPersistentEditor() самое оно. Огромное спасибо!!!!!