我只是关于Qt事件系统和QEvent
类的文档.我对该QObject::event()
方法的行为感兴趣.文件说明:
此虚函数接收事件到对象,如果事件e被识别和处理,则应返回true.
false
从event()
方法返回时的预期行为是什么?还有什么办法来处理这个事件?事件是否自动转发到父对象?
注意:我知道源代码可用,而且我有副本.我理想地寻找解决此行为的一些文档.
我正在尝试实现一个简单,轻量级的系统来记录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 …
我基本上有这段代码来拦截某些QTreeWidget
事件。
MyWidget :: MyWidget ()
{
m_tree = new QTreeWidget ();
// ...
m_tree -> installEventFilter (this);
}
bool MyWidget :: eventFilter (QObject * obj, QEvent * e)
{
if (m_tree != obj)
return QWidget :: eventFilter (obj, e);
qDebug () << e -> type ();
switch (e -> type ())
{
case QEvent :: MouseButtonPress:
case QEvent :: MouseButtonRelease:
case QEvent :: MouseMove:
case QEvent :: Leave:
qDebug () << "GOT EM";
break;
};
// ...
} …
Run Code Online (Sandbox Code Playgroud) 我找不到将鼠标事件附加到场景的方法。如果没有 View,所有事件都会被捕获,但是当注释掉时,只有 mousePressEvent 起作用。请帮忙。
from PySide import QtGui, QtCore
class Window(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.Scene()
self.View()
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
print "Pressed!!!"
def mouseMoveEvent(self, event):
print "moving....."
def mouseReleaseEvent(self, event):
print "-------released"
def Scene(self):
self.s = QtGui.QGraphicsScene(self)
def View(self):
self.v = QtGui.QGraphicsView(self.s)
self.setCentralWidget(self.v)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.resize(300, 200)
window.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud) qt ×4
qt-events ×4
c++ ×2
pyqt ×2
pyside ×1
python ×1
qmouseevent ×1
qt-signals ×1
qtreewidget ×1