PyQt为事件处理提供了两种机制:高级的信号和槽机制,以及低级的事件处理程序。前者已经介绍过,后者也有涉及,比如我们曾重新实现过窗口部件的closeEvent()。
PyQt为拦截和处理事件提供了5种不同的方式,这里只介绍最常用的头两种方式。
第一种是重新实现特定事件,如键盘和鼠标事件、重绘事件、尺寸大小改变事件等等,的处理程序。可参见代码示例。
第二种重新实现event()事件处理程序 。因为在任何特殊的事件处理程序被调用前,都会调用event()。重新实现这个方法,可以允许我们处理那些不能在某一特定事件处理程序(如对Tab键焦点转换行为的重新定义)中处理的事件,或者实现那些不存在明确事件处理程序的事件,比如QEvent.ToolBarChange。当需要重新实现这些处理程序时,可以对所有其它不是自己亲自处理的事件调用它们的基类的实现。
import sys
from PyQt5.QtWidgets import QMainWindow, QWidget, QApplication
from PyQt5.QtCore import Qt
class MainWindow(QMainWindow):
def __init__(self, parent = None):
super().__init__(parent)
self.initUI()
def initUI(self):
self.setWindowTitle("鼠标键盘事件示例")
self.setCentralWidget(QWidget())#指定主窗口中心部件
self.statusBar().showMessage("ready")#状态栏显示信息
self.resize(300,185)
#重新实现各事件处理程序
def keyPressEvent(self, event):
key = event.key()
if Qt.Key_A <= key <= Qt.Key_Z:
if event.modifiers() & Qt.ShiftModifier: #Shift 键被按下
self.statusBar().showMessage('"Shift+%s" pressed' % chr(key),500)
elif event.modifiers() & Qt.ControlModifier: #Ctrl 键被按下
self.statusBar().showMessage('"Control+%s" pressed' % chr(key),500)
elif event.modifiers() & Qt.AltModifier: #Alt 键被按下
self.statusBar().showMessage('"Alt+%s" pressed' % chr(key),500)
else:
self.statusBar().showMessage('"%s" pressed' % chr(key),500)
elif key == Qt.Key_Home:
self.statusBar().showMessage('"Home" pressed' ,500)
elif key == Qt.Key_End:
self.statusBar().showMessage('"End" pressed',500)
elif key == Qt.Key_PageUp:
self.statusBar().showMessage('"PageUp" pressed',500)
elif key == Qt.Key_PageDown:
self.statusBar().showMessage('"PageDown" pressed',500)
else: #其它未设定的情况
QWidget.keyPressEvent(self, event) #留给基类处理
'''
其它常用按键:
Qt.Key_Escape,Qt.Key_Tab,Qt.Key_Backspace,Qt.Key_Return,Qt.Key_Enter,
Qt.Key_Insert,Qt.Key_Delete,Qt.Key_Pause,Qt.Key_Print,Qt.Key_F1...Qt.Key_F12,
Qt.Key_Space,Qt.Key_0...Qt.Key_9,Qt.Key_Colon,Qt.Key_Semicolon,Qt.Key_Equal
...
'''
def mousePressEvent(self, event): #鼠标按下事件
pos = event.pos() #返回鼠标所在点QPoint
self.statusBar().showMessage('Mouse is pressed at (%d,%d) of widget '% (pos.x(),pos.y()),500)
globalPos = self.mapToGlobal(pos)
print('Mouse is pressed at (%d,%d) of screen '% (globalPos.x(),globalPos.y()))
def mouseReleaseEvent(self, event): #鼠标释放事件
pos = event.pos() #返回鼠标所在点QPoint
self.statusBar().showMessage('Mouse is released at (%d,%d) of widget '% (pos.x(),pos.y()),500)
if event.button() == Qt.LeftButton:
print("左键")
elif event.button() == Qt.MidButton:
print("中键")
elif event.button() == Qt.RightButton:
print("右键")
def mouseDoubleClickEvent(self, event): #鼠标双击事件
pos = event.pos() #返回鼠标所在点QPoint
self.statusBar().showMessage('Mouse is double-clicked at (%d,%d) of widget '% (pos.x(),pos.y()),500)
def mouseMoveEvent(self, event): #鼠标移动事件
pos = event.pos() #返回鼠标所在点QPoint
self.statusBar().showMessage('Mouse is moving at (%d,%d) of widget '% (pos.x(),pos.y()),500)
if __name__ == '__main__':
app = QApplication(sys.argv)
mw = MainWindow()
mw.show()
sys.exit(app.exec_())
本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!