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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Вот тебе, бабушка, и doubleClick...  (Прочитано 15495 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #15 : Апрель 01, 2015, 16:22 »

Можно подробнее. Не пойму в чем сложность получения currentIndex() или currentItem()?

В разнице между сложно и сложнее.

На таймере делается в полприхлопа:

Код:

bool wasdclick = false;
QTimer clicktimer;

void ManagerDialog::on_tableWidget_cellClicked(int row, int column)
{
    if( !wasdclick ) //
        clicktimer.singleShot( QApplication::doubleClickInterval(), this, SLOT(sendClick()) );
}

void ManagerDialog::on_tableWidget_cellDoubleClicked(int row, int column)
{
    wasdclick = true;
    qDebug() << "double";
}

void ManagerDialog::sendClick()
{
    if( ! wasdclick )
        qDebug() << "single";
    wasdclick = false;
}
« Последнее редактирование: Апрель 01, 2015, 16:30 от Гурман » Записан

2^7-1 == 127, задумайтесь...
sociopath
Гость
« Ответ #16 : Апрель 01, 2015, 16:26 »

Прошу прощения за неточность, при AllEditTriggers второй сигнал clicked "съедается". При NoEditTriggers действительно идет single, double, single
Записан
sociopath
Гость
« Ответ #17 : Апрель 01, 2015, 16:34 »

Кроме таймера ничего и не получится придумать.
У Qt-шников у самих в коде всякие прекрасные строчки типа:
Код:
    // we may get a double click event later
    if (trigger == SelectedClicked)
        d->delayedEditing.start(QApplication::doubleClickInterval(), this);
(это в QAbstractItemView::edit, например)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Апрель 01, 2015, 16:57 »

Много лет назад я на Ассемблере сам прерывания обрабатывал,
Та кто их тогда не обрабатывал? Разве что бабы - и то находились любительницы. Не надо молодым пыль в глаза пускать  Улыбающийся

...и вызывает неподдельное удивление, что в ТАКОМ высокоуровневом фреймворке, как Qt далеко не первой версии, приходится сползать чуть ли не на тот же уровень.

Скорее всего, просто авторы забыли, как и во многих других местах. Придётся suggestion писать, чтобы сделали отключение этой ненужной фичи.
Ну сказали тоже. А если мне пофиг тот double-click. я хочу использовать свой интервал времени и/или допуск смещения мышака?

На таймере делается в полприхлопа:
И что, каждый раз ждем-с не будет ли еще нажатия? Только если мерзавец-юзер не нажал - тогда уж работаем? Как-то смахивает на "два притопа"  Улыбающийся
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #19 : Апрель 01, 2015, 17:07 »

А если мне пофиг тот double-click. я хочу использовать свой интервал времени и/или допуск смещения мышака?

так может работать и по-умолчанию, для совместимости со старым кодом

а если надо по-нормальному, то вызов QTableWidget::setProcessDoubleClickSeparately( true ) и пусть работает по-нормальному

что, каждый раз ждем-с не будет ли еще нажатия? Только если мерзавец-юзер не нажал - тогда уж работаем?

а это вот совершенно не важно, важно то, что работает как требуется
Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Апрель 10, 2015, 05:36 »

А история-то имеет продолжение. Вчера полезло у меня какое-то багво на double-click, начал разбираться. Никаких 3 событий в Qt 5 нет (OSX + Qt 5.4, Win7 + Qt 5.3.2). Вот печать (первое событие QWindow, второе QWidget, это нормально)

Цитировать
5 MouseButtonPress QWidgetWindow(0x266e7f0, name = "QWidgetClassWindow") delta = 4992
6 MouseButtonPress QWidget(0x266e4d0) delta = 0

7 MouseButtonRelease QWidgetWindow(0x266e7f0, name = "QWidgetClassWindow") delta = 120
8 MouseButtonRelease QWidget(0x266e4d0) delta = 0

9 MouseButtonPress QWidgetWindow(0x266e7f0, name = "QWidgetClassWindow") delta = 88
10 MouseButtonDblClick QWidgetWindow(0x266e7f0, name = "QWidgetClassWindow") delta = 0
11 MouseButtonDblClick QWidget(0x266e4d0) delta = 0

12 MouseButtonRelease QWidgetWindow(0x266e7f0, name = "QWidgetClassWindow") delta = 120
13 MouseButtonRelease QWidget(0x266e4d0) delta = 0
Тестовый пример прилагаю.

Однако же.... как все (включая меня) доверчивы и как легко нас ввести в заблуждение  Улыбающийся
Записан
Bepec
Гость
« Ответ #21 : Апрель 10, 2015, 08:46 »

Igors - а где нет 3 событий?

Я вижу тут 2 release и 1 double click.
2 + 1 = Непонимающий?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Апрель 10, 2015, 09:48 »

Igors - а где нет 3 событий?

Я вижу тут 2 release и 1 double click.
2 + 1 = Непонимающий?
В пятерке сначала окно (QWindow) принимает событие а потом диспатчит его виджету. Где delta = 0 значит то же самое событие. Итого при dbl виджет получает

MouseButtonPress
MouseButtonRelease
MouseButtonDblClick
MouseButtonRelease
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #23 : Апрель 10, 2015, 10:18 »

в 1-м сообщении я говорил не о 3х событиях, а о 3х сигналах
Записан

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #24 : Апрель 10, 2015, 10:23 »

update to Гурман:
Принципиальной разницы нет, 3 события вызывают 3 сигнала.

To Igors:
Начну с теории.
Вы надеюсь в курсе, что приложения делятся на
1. работающие по press кнопок.
2. работающие по release кнопок.

Имеются и смешанные реакции, но это довольно редко.

В данном случае мы видим второй вариант, потому press событие мы отбрасываем. Остаётся
MouseButtonRelease
MouseButtonDblClick
MouseButtonRelease

В данном случае посыл события происходит после второго release, но до отправки события диспетчеру. Т.е. расшифровываем более подробно:

User отпустил кнопку
Обработчик событий, посыл события MouseButtonRelease
User отпустил кнопку
Обработчик событий, посыл события MouseButtonDblClick
Обработчик событий, посыл события MouseButtonRelease

Т.к. очередность посыла событий нигде не описана и не регламентирована, то и возразить нечем.

PS не надо взывать к логике и вашему видению ситуации - нигде не регламентировано, так что всё прочее лишь ваше личное мнение Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #25 : Апрель 10, 2015, 11:07 »

To Igors:
Начну с теории.
Вы надеюсь в курсе, что приложения делятся на
1. работающие по press кнопок.
2. работающие по release кнопок.
Совершенно не в курсе, первый раз слышу чтобы хоть что-то кроме драга срабатывало по  release кнопки  Улыбающийся

В данном случае посыл события происходит после второго release, но до отправки события диспетчеру. Т.е. расшифровываем более подробно:

User отпустил кнопку
Обработчик событий, посыл события MouseButtonRelease
User отпустил кнопку
Обработчик событий, посыл события MouseButtonDblClick
Обработчик событий, посыл события MouseButtonRelease
То есть никакого dbl-click не случится пока мыша зажата? Но вот я прямо в этом письме dbl-click'нул на слово и не отпускаю - а слово почему-то уже подсветилось. Как же так  Непонимающий

PS не надо взывать к логике и вашему видению ситуации - нигде не регламентировано, так что всё прочее лишь ваше личное мнение Веселый
Типа "зашланговался" чтобы иметь отмазки когда возьмут за жопу Улыбающийся Образы Николая Васильевича бессмертны, такие люди будут всегда  Улыбающийся
Записан
Bepec
Гость
« Ответ #26 : Апрель 10, 2015, 11:12 »

Как то невнятно вы описали в чем я неправ Улыбающийся Как определитесь и сформулируете, пожалуйста Улыбающийся
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #27 : Апрель 10, 2015, 11:41 »

update to Гурман:
Принципиальной разницы нет, 3 события вызывают 3 сигнала.

Уго, но моё замечание не к вам относилось. Суть вы сами пояснили. Добавлю только - сигналы о кнопках посылаются при отпускании кнопок. Но сигнал о даблклике посылается при втором нажатии - если оно было обнаружено в пределах установленного интервала времени. Справедливости ради, есть сигнал QTableWidget::itemPressed( QTableWidgetItem * item ) - первое нажатие, я его даже сразу не заметил.

На самом деле, в сигналах сбивают с толку их названия itemClicked и itemDoubleClicked, хотя itemPressed - часть этой последовательности, но по названию этого не видно. И в документации не сказано, в какой последовательности они идут. Было бы это описано - нет вопросов.
« Последнее редактирование: Апрель 10, 2015, 11:51 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #28 : Апрель 10, 2015, 12:04 »

Как любят говорить разработчики open sourse продуктов - это тема для самостоятельного изучения Веселый
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #29 : Апрель 10, 2015, 12:31 »

ну или, хотя бы, назвали бы itemDoublePressed - уже совсем другое дело
Записан

2^7-1 == 127, задумайтесь...
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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