Russian Qt Forum

Qt => Model-View (MV) => Тема начата: __Heaven__ от Март 14, 2016, 13:33



Название: doubleClick по чекбоксу во вьюхе
Отправлено: __Heaven__ от Март 14, 2016, 13:33
Привет, друзья!
У меня имеется QTreeView, в ней первым столбцом идут элементы с чекбоксами (подписанными). Если я хочу ставить/снимать галочку очень часто, то у меня получается нежелательное срабатывание сигнала doubleClicked. Можно ли как-то обойти это поведение? При этом хочу, чтобы при двойном клике на подпись к чекбоксу сигнал doubleClicked срабатывал.


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: Bepec от Март 14, 2016, 13:46
Установите проверку координатную. Если координаты на чекбоксе - игнорировать.


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: __Heaven__ от Март 14, 2016, 13:55
А это кроссплатформенно?


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: kambala от Март 14, 2016, 13:55
может проще на колонку виджет назначить? тогда события ловить легко будет.


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: __Heaven__ от Март 14, 2016, 13:57
kambala, можно подробнее? Что имеется в виду.


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: __Heaven__ от Март 14, 2016, 14:06
Кстати, забыл сказать, что мне надо, чтобы надпись была редактруемой.


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: kambala от Март 14, 2016, 14:12
kambala, можно подробнее? Что имеется в виду.
а не, виджеты назначаются только для QTreeWidget. для QTreeView нужен делегат в таком случае.

а может проще просто разрезать чекбокс и текст на 2 колонки? :)


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: __Heaven__ от Март 14, 2016, 14:15
Ну это самое простое и очевидное, что я и выберу, если не найдётся годных решений. Не хочется, чтобы пользователь имел в хэдере кнопочку для упорядочивания чекбоксов :)


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: Bepec от Март 14, 2016, 16:09
Это кроссплатформенно будет. Во всяком случае linux/win точно.
Насколько я помню там чекбокс хитро спрятан и до него дотянуться почти нереально. Но месторасположение его вроде не меняется.


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: __Heaven__ от Март 14, 2016, 16:20
А как мне понять его габариты и положение?


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: kambala от Март 14, 2016, 16:38
Не хочется, чтобы пользователь имел в хэдере кнопочку для упорядочивания чекбоксов :)
ну так сортировку для них можно отключить, разве нет?


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: __Heaven__ от Март 14, 2016, 16:41
Можно. Но само наличие кнопки просто мозолит глаза.
Ещё и ресайз колонки будет доступен.


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: Racheengel от Март 14, 2016, 16:47
Еще можно свой делегат сделать, состоящий собственно из чекбокса без текста и лэйбла.


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: __Heaven__ от Март 14, 2016, 17:06
Зачем?
Это же будет тот же самый айтем, просто чекабл и без текста. Что kambala и предлагает.


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: __Heaven__ от Март 15, 2016, 14:15
А как Qt фиксирует двойной клик? Системно или же с помощью каких-нибудь таймеров?
Я могу при тыке в чекбокс сбрасывать эти таймеры? то есть, сообщать, что последующий клик будет одиночным, а не частью даблклика?


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: Igors от Март 15, 2016, 14:37
Попробуйте отловить координаты бубочки через QStyle::subElementRect подобрав SE_ константу. И еще - смутно помню, но если просто перекрыть событие doubleClicked (или e->ignore() ?), то будет вызываться просто второй press (что и требуется).  


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: __Heaven__ от Март 15, 2016, 14:40
Пробовал обмануть хитрый Qt :)
Код
C++ (Qt)
   const int interval = qApp->doubleClickInterval();
   qApp->setDoubleClickInterval(0);
   qApp->setDoubleClickInterval(interval);
 
Не помогло


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: __Heaven__ от Март 15, 2016, 14:46
Я не хочу его полностью перекрывать. Мне необходим даблклик при нажатии на лэйбл. См. аттач.


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: Igors от Март 15, 2016, 15:19
Я не хочу его полностью перекрывать. Мне необходим даблклик при нажатии на лэйбл. См. аттач.
Я понял, но в любом случае Вам нужен QRect бубочки (чтобы так перекрыть а так нет). Надо разрывать QStyledItemViewOption (сначала сделав initStyleOptions)


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: __Heaven__ от Март 15, 2016, 15:22
Да, Верес это и предложил. Но этот метод по степени костыльности в моём представлении стоит на первом месте. :) Пока что гляжу в сторону костыля с запуском таймера нажатия на чекбокс.


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: Igors от Март 15, 2016, 15:31
Да, Верес это и предложил. Но этот метод по степени костыльности в моём представлении стоит на первом месте. :) Пока что гляжу в сторону костыля с запуском таймера нажатия на чекбокс.
Никакой "костыльности" здесь нет, если конечно не срисовывать чекбокс с экрана, а получить его QRect средствами Qt. Это 100% легально, для всех платформ и стилей


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: Bepec от Март 15, 2016, 15:48
Чем костыльнее метод, тем он вернее - работает в 50% случаев :D


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: __Heaven__ от Март 15, 2016, 16:06
50% и я добился  ;D ;D ;D ;D :D :D
Код
C++ (Qt)
   const int interval = qApp->doubleClickInterval();
   qApp->setDoubleClickInterval(0);
   auto magic = [=](){qApp->setDoubleClickInterval(interval);};
   QTimer::singleShot(interval, magic);
 


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: Bepec от Март 15, 2016, 16:12
Эээ... И это даёт возможность сделать дабл клик на надписи? :D


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: __Heaven__ от Март 15, 2016, 16:20
Представьте, да! :)
Смысл в том, что при затрагивании переключателя запускается этот код. Он на интервал даблклика отключает возможность даблкликать :D
Но есть жирный минус. Если очень быстро тыкать по чекбоксу, то наступит момент, когда предыдущий singleShot откроет возможность расценить клик как даблклик.


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: __Heaven__ от Март 15, 2016, 16:26
Если что,
I did it for the lulz :)


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: Bepec от Март 15, 2016, 18:51
Да, теперь моя очередь сказать -
Цитировать
Но этот метод по степени костыльности в моём представлении стоит на первом месте. :D

PS но сам факт что мысль пошла по этому пути интересен :D


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: Igors от Март 16, 2016, 13:43
Если я правильно понял, при двойном клике на чекбокс поведение должно быть таким же как при одиночном. Это вообще-то спорно (нужно ли такое). Ну ладно, аттач


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: __Heaven__ от Март 16, 2016, 13:57
Не, не оно.
Код
C++ (Qt)
   QObject::connect(treeW, &QTreeWidget::itemDoubleClicked, []{qDebug() << "doubleclicked";});
 

Надо, чтобы галка тыкалась при каждом щелчке, а вот этот сигнал не эмитился при сколь угодно частых тыках по галке.


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: Igors от Март 16, 2016, 14:28
Надо, чтобы галка тыкалась при каждом щелчке, а вот этот сигнал не эмитился при сколь угодно частых тыках по галке.
А изменить пару строк в готовом примере читатель Свттера не может?


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: __Heaven__ от Март 16, 2016, 14:44
изменить пару строк
Так а код плохо читается и с нарушением инкапсуляции. Ну сравните...
Код
C++ (Qt)
       switch (e->type()) {
           case QEvent::MouseButtonDblClick:
               break;
           default:
               return false;
       }
 

Код
C++ (Qt)
       if (e->type() != QEvent::MouseButtonDblClick){
           return false;
       }
 
Спасибо, конечно, за уделённое время. Позже постараюсь разгрести его и примерить на View. Сейчас работает как требуется.


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: Igors от Март 16, 2016, 15:01
Так а код плохо читается и с нарушением инкапсуляции. Ну сравните...
Просто сразу заряжено на большее число событий.

Спасибо, конечно, за уделённое время. Позже постараюсь разгрести его и примерить на View.
Не нравится, хотелось лихо проскочить парой строчек (ну пятком) :) А тут какая-то длинная возня... Ну что поделаешь, бывает и так (и часто). И не "гребите" в сторону наследования, фильтр гибче. 


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: Old от Март 16, 2016, 18:43
И не "гребите" в сторону наследования, фильтр гибче. 
Только наследование позволяет получить законченный компонент, в отличие от соплей из фильтров событий.
А уж какие чудеса возможны, когда кто угодно устанавливает фильтры на что угодно. :) Ты ждешь событие от мышки, а оно не приходит...  :o А потом оказывается, что где то далеко, кто-то поставил фильтр и уже сам об этом забыл.

2__Heaven__ Фильтр событий это костыль, который позволяет сделать много, но использовать его стоит в крайнем случае.


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: __Heaven__ от Март 16, 2016, 19:12
Спасибо за предупреждение.
У меня класс вьюхи уже наследован. Так что я собираюсь заниматься только перегрузкой. :)


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: Igors от Март 17, 2016, 11:29
Спасибо за предупреждение.
У меня класс вьюхи уже наследован. Так что я собираюсь заниматься только перегрузкой. :)
Это квалифицируется как "не плодите сущностей". Пока табличка одна - все прекрасно, наследование выглядит более капитально. Но как только то же самое потребуется в другой... Правда до этого еще надо дожить  :)


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: Old от Март 17, 2016, 11:44
Пока табличка одна - все прекрасно, наследование выглядит более капитально.
Это всегда более капитально. Когда появятся новые таблички, достаточно взять законченную и спокойно использовать, а не вспоминать, какой костылец нужно добавить, что бы заработало и здесь.


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: Igors от Март 17, 2016, 12:05
Это всегда более капитально. Когда появятся новые таблички, достаточно взять законченную и спокойно использовать,
Таблицы имеют совершенно разную "начинку", поэтому наследовать одну от другой - утопия. Делать общий базовый класс (в который свалить такие вещи) - возможно, но он выглядит довольно бестолково, по существу - набор "утилей". Ну так лучше и признать это, отказавшись от липового наследования
...а не вспоминать, какой костылец нужно добавить, что бы заработало и здесь.
Почему "костылец"? Наоборот, удобно и гибко. А чтобы "не забыть" - можно напр так
Код
C++ (Qt)
void InitMyTreeWidget( QTreeWidget * tree )
{
tree->viewport()->installEventFilter(..)
// тут еще найдется что делать
}
Надо стремится к сокращению числа классов (а не фильтров)


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: Old от Март 17, 2016, 12:12
Надо стремится к сокращению числа классов (а не фильтров)
Это большое заблуждение. :)
Для чего использовать C++, если все пихать в один класс MainWindow?


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: Old от Март 17, 2016, 12:13
но он выглядит довольно бестолково
Для вас это выглядит бестолково, потому что вы не используете С++, а используете С с классами. Это разные языки и разные подходы.


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: __Heaven__ от Март 17, 2016, 12:27
какая-то длинная возня...
бывает и так (и часто)
Скорее всего именно из-за этого подхода :)


Название: Re: doubleClick по чекбоксу во вьюхе
Отправлено: Igors от Март 17, 2016, 13:13
Скорее всего именно из-за этого подхода :)
А вот "подпевать" нехорошо :) Есть лучшее решение - предъявляем, а то о "подходах" всякий калякать горазд.