Название: 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 :)
Код Не помогло Название: 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
Код
Название: 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 Не, не оно.
Код
Надо, чтобы галка тыкалась при каждом щелчке, а вот этот сигнал не эмитился при сколь угодно частых тыках по галке. Название: Re: doubleClick по чекбоксу во вьюхе Отправлено: Igors от Март 16, 2016, 14:28 Надо, чтобы галка тыкалась при каждом щелчке, а вот этот сигнал не эмитился при сколь угодно частых тыках по галке. А изменить пару строк в готовом примере читатель Свттера не может? Название: Re: doubleClick по чекбоксу во вьюхе Отправлено: __Heaven__ от Март 16, 2016, 14:44 изменить пару строк Так а код плохо читается и с нарушением инкапсуляции. Ну сравните...Код
Код Спасибо, конечно, за уделённое время. Позже постараюсь разгрести его и примерить на 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 Это всегда более капитально. Когда появятся новые таблички, достаточно взять законченную и спокойно использовать, Таблицы имеют совершенно разную "начинку", поэтому наследовать одну от другой - утопия. Делать общий базовый класс (в который свалить такие вещи) - возможно, но он выглядит довольно бестолково, по существу - набор "утилей". Ну так лучше и признать это, отказавшись от липового наследования...а не вспоминать, какой костылец нужно добавить, что бы заработало и здесь. Почему "костылец"? Наоборот, удобно и гибко. А чтобы "не забыть" - можно напр такКод Надо стремится к сокращению числа классов (а не фильтров) Название: 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 Скорее всего именно из-за этого подхода :) А вот "подпевать" нехорошо :) Есть лучшее решение - предъявляем, а то о "подходах" всякий калякать горазд. |