带有 Qt/QML 应用程序的 Windows 7 中的自定义触摸行为
Posted
技术标签:
【中文标题】带有 Qt/QML 应用程序的 Windows 7 中的自定义触摸行为【英文标题】:Custom Touch behavior in Windows 7 with Qt/QML application 【发布时间】:2014-12-12 14:20:46 【问题描述】:我正在使用 Qt/QML 为 Windows 7 开发触摸应用程序。最终用户设备具有 Windows 7 的原生触摸行为,即:触摸屏幕时,最后触摸点上会出现一个点,当物理触摸结束时,Windows 会将该点放在现在触摸点上并运行在点击事件中。
与从标准 Windows 鼠标使用中知道的行为相比,一旦涉及到例如,这会导致不同的行为。单击某个按钮:鼠标用户会期望当鼠标按钮按下时按钮颜色会变为按下时的颜色,而当鼠标按钮向上时颜色会再次变为默认颜色。
在我的应用程序中,我希望有一种自定义的触摸反馈方式:应该使用更改的按钮颜色来标记当前被触摸的内容,在实际物理触摸开始时模仿“鼠标按下”并模仿“鼠标”当实际的身体接触结束时上升”。
我的应用程序将全屏运行,因此实际的可能性是在应用程序启动时更改系统的行为并在应用程序结束时将其更改回默认值。
这样的行为实际上与 e.g. 的标准行为相同。我知道的所有 android 设备。
我搜索了所有 MouseArea 和 MultiPointTouchArea 元素,试图找到一种方法来使点击反应行为与标准行为不同。然而,我什至没有找到捕捉实际触摸开始的方法......我想在触摸开始时发生的所有事情实际上在触摸结束时发生。
编辑: 如果我使用 QML 按钮或 mousearea 加上 MouseArea.pressed 属性并不重要:在手指离开触摸并且调用 onClicked() 之前,什么都不会被“按下”。
可能相关: Adobe AIR: touch screen doesn't trigger mouse down event correctly - 但我没有找到从原生 Qt 应用程序访问 Multitouch.inputMode 等函数的方法(在第一个回复中提到)。
我怎样才能为我的应用程序实现所描述的行为?
【问题讨论】:
我不知道我是否明白你的意思,但是,在“在我的应用程序中,我想要 [...]”这句话之后......使用标准 QMLButton
s 类型与自定义Style
s?这样您就可以获得所需的颜色/效果。对于MouseArea
您有pressed
和release
的问题,事件管理的粒度是否不足以满足您的需求?还是你第一句话说的重点的产生,主要问题?
为澄清添加了一句:如果我使用 QML 按钮或鼠标区域加上 MouseArea.pressed 属性并不重要:在手指离开触摸和 onClicked( ) 甚至被调用。这就是我想要改变的 ;-) 还添加了在上面的文本中为未来的读者剪掉的内容。
这不是“加压”。它只是您感兴趣的onPressed
事件处理程序和onRelease
事件处理程序。onclick
事件处理程序肯定超出了这里的范围,不应在您的MouseArea
代码中定义/使用。不过,问题是:这两个处理程序和样式的组合是否解决了您的问题?应该不会吧?
不,它不会:Windows 7 的原生触摸行为在停止实际触摸时会触发以下事件序列:onPressed -> onReleased -> onClicked。
终于明白了。在应用程序上使用MouseArea
并使用其onRelease
为底层GUI 生成事件可能是一个(我知道的粗略的)解决方案。事件接受和转发非常简单。
【参考方案1】:
此问题的解决方案是禁用应用程序的“按住”。这是可以在系统范围的设置中使用 ... 控制面板 -> 触控笔和触控 -> 触控 -> 按住 -> 设置 -> 取消选中“启用按住以进行右键单击”
我在本机代码中找到的唯一解决方案可以在这里找到: http://msdn.microsoft.com/en-us/library/ms812373.aspx
我检查了这至少仍然适用于 Windows 7。为了让它适用于 QML,我在 QQmlApplicationEngine::rootObjects() 中搜索了 QWindow* 并将其 winId 用作 HWND。使用该 HWND,我从 app.exec() 之前的链接中调用了 TogglePressAndHold 函数。
【讨论】:
以上是关于带有 Qt/QML 应用程序的 Windows 7 中的自定义触摸行为的主要内容,如果未能解决你的问题,请参考以下文章
Windows 上 Webview 的 Qt QML 后备组件
Qt/QML:带有 Keys.onPressed 的 TextInput 仅接收 DEL 键而不接收其他键