Qt/Qml - 触发QApplication/QQmlApplicationEngine事件(键鼠事件)

Qt/Qml - Trigger QApplication/QQmlApplicationEngine events (key and mouse events)

我应该触发我的 Qt/Qml 应用程序中的所有事件。特别是我试图触发键和鼠标事件。我会用 QTimer 实现一种待机,当事件被触发时它会重置。 可以在我的 Qt/Qml 应用程序中实现此功能吗?

impossible to trigger events from all of these widgets (using onClicked() signal for example)

为什么不呢?每个应用程序都有多个 "widgets" 并且在几乎所有情况下都是使用信号处理程序挂钩完成的,但我的意思是非常罕见的例外。

Thus I should trigger a general events on QApplication to know if mouse or keyboard buttons has been clicked

然后使用一些个人方法来确定该事件应该做什么?如果您的应用程序确实像您声称的那样在 GUI 元素中多样化,那么这听起来是一个非常糟糕的主意。我非常怀疑创建一个比已经实施的解决方案更强大或更有效的解决方案是否会更容易,或者就此而言问题更少。

要么您对 QML 及其编程范式完全陌生,并且没有意识到处理程序挂钩是进行用户交互的预期方式,这种情况更有可能发生,要么您正在尝试做一些非常 "custom".

实现键盘和鼠标事件的 "global" 处理程序并不难,只需在您的应用程序 window 之上放置一个 MouseArea 并使用它来捕获所有鼠标交互,并将键盘焦点设置在充当键盘事件接收器的单个项目上。

然而,这意味着一旦您这样做,您将全权负责手动管理事件的定向方式。我已经为键盘事件做了这个,因为 QML 的 "one focus item" 设计不适合我的特殊需要,我可以告诉你,这很麻烦。对鼠标也这样做只会让它变得更难,更容易出错。

这也意味着您必须放弃 QML 提供的几乎所有 UI 元素,因为它们都依赖于接收实际的焦点和事件。

当然,您可以从 C++ 中拦截甚至更低级别的事件,但这只会更加困难并且更容易破坏内容。

考虑到您稀疏的 activity 历史,看起来您真正需要做的是更好地熟悉 QML 背后的编程范式,而不是询问您不需要做的事情,而且确实不想做,因为它们很复杂且不必要,并且在大多数用例中代表了非常适得其反的反模式。