Настраиваемое поведение касания в Windows 7 с приложением Qt / QML

Я разрабатываю сенсорное приложение для Windows 7 с Qt / QML. Устройство конечного пользователя имеет собственное сенсорное поведение Windows 7, то есть: при прикосновении к экрану точка появляется на точке последнего касания, а при завершении физического касания Windows помещает эту точку на точку, которой коснулись сейчас, и запускается в событии по щелчку.

По сравнению с поведением, которое известно из стандартного использования мыши в Windows, это приводит к другому поведению, как только дело доходит, например, до нажатие какой-либо кнопки: пользователь мыши будет ожидать, что кнопка изменит цвет на цвет нажатого вниз, когда кнопка мыши опущена, в то время как цвет снова изменится на цвет по умолчанию, когда кнопка мыши поднимется.

В моем приложении я хочу иметь настраиваемый способ обратной связи касания: то, к чему в данный момент прикасаются, следует отмечать с помощью измененных цветов кнопок, имитируя «мышь опускается вниз», когда начинается фактическое физическое касание, и имитируя «мышь поднимается вверх». когда заканчивается физическое прикосновение.

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

Такое поведение будет фактически таким же, как стандартное поведение, например, на все устройства Android, которые я знаю.

Я просмотрел все элементы MouseArea и MultiPointTouchArea, пытаясь найти способ просто сделать поведение реакции щелчка отличным от стандартного. Однако я даже не нашел способа запечатлеть начало фактического прикосновения ... Все, что я хочу, чтобы произошло в начале прикосновения, на самом деле происходит, когда прикосновение заканчивается.

Изменить: не имеет значения, использую ли я кнопку QML или область мыши плюс свойство MouseArea.pressed: ничего не будет «нажато» до того, как палец покинет касание и даже будет вызван onClicked ().

Возможно, связано: Adobe AIR: сенсорный экран не запускается событие нажатия мыши правильно - но я не нашел способа получить доступ к функциям, подобным Multitouch.inputMode (которые упомянуты в первом ответе), из собственного приложения Qt.

Как я могу добиться описанного поведения для моего приложения?


person FourtyTwo    schedule 12.12.2014    source источник
comment
Я не знаю, понял ли я вашу точку зрения, но, следуя предложению В моем приложении, я хочу [...] ... как насчет использования стандартного типа QML Buttons с пользовательскими Styles? Таким образом вы можете получить желаемые цвета / эффекты. Что касается MouseArea, у вас pressed и release, недостаточно ли такой детализации в управлении событиями для ваших нужд? Или это основная проблема, о которой вы говорите в первом предложении?   -  person BaCaRoZzo    schedule 12.12.2014
comment
Добавлено одно сообщение для пояснения: не имеет значения, использую ли я кнопку QML или область мыши плюс свойство MouseArea.pressed: ничего не будет нажато, пока палец не покинет касание и даже не будет вызвана функция onClicked (). И это то, что я хочу изменить ;-) Также добавил, что это вырезано в тексте выше для будущих читателей.   -  person FourtyTwo    schedule 15.12.2014
comment
Это не плюс прессы. Это просто onPressed обработчик событий и onRelease обработчик событий, которые вас интересуют. Обработчик событий onclick определенно выходит за рамки здесь и не должен определяться / использоваться в вашем MouseArea коде. Тем не менее, вопрос в том, решает ли комбинация двух обработчиков и стилей вашу проблему? Возможно нет?   -  person BaCaRoZzo    schedule 15.12.2014
comment
Нет, это не так. Собственное сенсорное поведение Windows 7 запускает следующую последовательность событий при остановке фактического касания: onPressed - ›onReleased -› onClicked.   -  person FourtyTwo    schedule 16.12.2014
comment
Я наконец понял. Наличие MouseArea над приложением и использование его onRelease для генерации событий для нижележащего графического интерфейса может быть (как я знаю) решением. Принятие события и его отправка довольно просты.   -  person BaCaRoZzo    schedule 16.12.2014
comment
Но это будет означать такое же поведение, как и с простой кнопкой QML, поэтому она не вносит нужных мне изменений, насколько я могу видеть?   -  person FourtyTwo    schedule 17.12.2014
comment
Я не знаю. :) После того, как вы нажали MouseArea, вы можете поиграть с другими обработчиками внизу, как хотите. Но, возможно, я все еще что-то упускаю, извините, если я не помог.   -  person BaCaRoZzo    schedule 17.12.2014
comment
Windows генерирует сообщения мыши для сенсорного ввода, чтобы обеспечить базовую поддержку сенсорного ввода для приложений, которые не были специально подготовлены для сенсорного ввода. В вашем конкретном сценарии может быть полезно отфильтровать эти сгенерированные сообщения мыши (см. Системные события и сообщения мыши). Qt5 теоретически может различать сгенерированные сообщения мыши и сообщения, поступающие от аппаратного ввода. Как всегда, Qt то и дело лажает, поэтому вам следует установить собственный собственный фильтр сообщений.   -  person IInspectable    schedule 09.02.2015


Ответы (1)


Решение этой проблемы - отключить для приложения функцию «Нажать и удерживать». Это то, что можно сделать в общесистемных настройках, используя ... Панель управления -> Перо и касание -> Сенсор -> Нажатие и удерживание -> Настройки -> снимите флажок «Включить нажатие и удерживание для щелчка правой кнопкой мыши»

Единственное решение, которое я нашел для этого в собственном коде, можно найти здесь: http://msdn.microsoft.com/en-us/library/ms812373.aspx

Я проверил, что это, по крайней мере, все еще работает для Windows 7. Чтобы заставить его работать для QML, я поискал QWindow * в QQmlApplicationEngine :: rootObjects () и использовал его winId как HWND. С этим HWND я вызвал функцию TogglePressAndHold по ссылке перед app.exec ().

person FourtyTwo    schedule 15.01.2015