创建自定义事件,要使用QCoreApplication的以下静态方法:
sendEvent(QObject receiver, QEvent event) - 事件被QCoreApplication的notify()函数直接发送给receiver对象,返回值是事件处理函数的返回值。使用这个函数必须要在栈上创建对象;
postEvent(QObject receiver, QEvent event) - 事件添加到事件对列是并立即返回,等待处理。 这种方法是线程安全的,因此它可以在多线程应用程序中用于在线程之间交换事件。另外,使用这个函数必须要在堆上创建对象。
这两个函数中的 receiver参数为事件发往的控件;event参数可为标准事件类的事件( 如QMouseEvent)对象,也可以是继承自QEvent的了类 class对象。以下是发送MouseButtonPress事件给标签控件的代码:
e = QtGui.QMouseEvent(QtCore.QEvent.MouseButtonPress,
QtCore.QPointF(5, 5), QtCore.Qt.LeftButton,
QtCore.Qt.LeftButton, QtCore.Qt.NoModifier)
QtCore.QCoreApplication.sendEvent(self.label, e)
要发送自定义事件,您必须创建一个QEvent的继承类,并在类中使用registerEventType( )静态函数注册自定义事件,同时将事件标识符存储在类属性中。
class MyEvent(QtCore.QEvent):
idType = QtCore.QEvent.registerEventType()
def init(self, data):
QtCore.QEvent.init(self, MyEvent.idType)
self.data = data
def get_data(self):
return self.data
将MyEvent事件发送到标签控件的代码:
QtCore.QCoreApplication.sendEvent(self.label, MyEvent("512"))
可以使用event(self,even)或customEvent(self,event)方法来处理自定义事件。例如:
def customEvent(self, e):
if e.type() == MyEvent.idType:
self.setText("Received data: {0}".format(e.get_data()))