Stu*_*erg 9 c++ python qt pyqt qt-events
我正在尝试实现一个简单,轻量级的系统来记录Qt GUI事件并从脚本中播放它们.我认为使用Qt事件系统的魔力会相当简单,但我遇到了一个我不明白的问题.
以下是我正在做的事情的快速摘要:
记录:
我QApplication.instance().eventFilter()用来捕获我感兴趣的所有GUI事件*并将它们保存到Python脚本中,其中每个步骤看起来像这样:
obj = get_named_object('MainWindow.my_menubar')
recorded_event = QMouseEvent(2, PyQt4.QtCore.QPoint(45, 8), 1, Qt.MouseButtons(0x1), Qt.KeyboardModifiers(0x0))
post_event(obj, recorded_event)
Run Code Online (Sandbox Code Playgroud)
回放:
我只是在一个worker(非GUI)线程中执行上面的脚本.(我不能使用GUI线程,因为我想继续向应用程序发送脚本事件,即使在模式对话框eventloop运行时'main'eventloop被阻止.)
重要的东西发生在我的post_event()函数中,它需要做两件事:
QApplication.postEvent(obj, recorded_event)obj正在运行的同一事件循环中.QApplication.processEvents()在第二部分完成之后,我的期望是第一部分(记录的事件)的所有效果都已完成,因为特殊事件在记录的事件之后排队.
整个系统似乎主要适用于鼠标事件,关键事件等.但是QAction当我尝试为主要事件播放事件时,我遇到了处理程序的问题QMenuBar.
无论我尝试什么,似乎我都不能强制我的回放线程阻止完成QAction.triggered因点击我的QMenu项目而导致的所有处理程序.据我所知,在处理程序完成之前QApplication.processEvents()返回.QAction
QMenu小部件或QAction信号是否有特殊之处,违反了正常规则QApplication.postEvent()和/或QApplication.processEvents()? 我需要一种阻止完成我QMenu的QAction处理程序的方法.
[*]并非每个事件都被记录下来.我只记录spontaneous()事件,我还过滤掉了一些其他类型(例如Paint事件和普通的鼠标移动).
[**]这很重要,因为脚本中的下一个事件可能引用上一个事件创建的窗口小部件.
我认为您的问题可能最好通过使用 QFuture 和 QFutureWatcher 来解决(也就是说,如果您使用 QtConcurrent 线程命名空间,而不是 QThreads)。基本上,Qt 事件处理系统不一定按照事件发布的顺序处理事件。如果您需要阻塞直到某个操作完成,并且您在单独的线程中执行该操作,则可以使用 QtConcurrent::run() 返回的 QFuture 对象和 QFutureWatcher 来阻塞,直到该特定线程完成其处理。
其他需要考虑的是处理事件的方式。当您使用 QApplication.postEvent() 时,您创建的事件将被添加到接收者的事件队列中以供稍后处理。在幕后,Qt 可以重新排序和压缩这些事件以节省处理器时间。我怀疑这更多是你的问题。
在处理播放的函数中,考虑使用 QCoreApplication::processEvents(),它在所有事件处理完成之前不会返回。QCoreApplication 的文档位于此处。
| 归档时间: |
|
| 查看次数: |
1999 次 |
| 最近记录: |