前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PyQt 键盘事件和鼠标事件

PyQt 键盘事件和鼠标事件

作者头像
用户6021899
发布2019-08-14 15:49:09
6.4K0
发布2019-08-14 15:49:09
举报
文章被收录于专栏:Python编程 pyqt matplotlib

PyQt为事件处理提供了两种机制:高级的信号和槽机制,以及低级的事件处理程序。前者已经介绍过,后者也有涉及,比如我们曾重新实现过窗口部件的closeEvent()。

PyQt为拦截和处理事件提供了5种不同的方式,这里只介绍最常用的头两种方式。

第一种是重新实现特定事件,如键盘和鼠标事件、重绘事件、尺寸大小改变事件等等,的处理程序。可参见代码示例。

第二种重新实现event()事件处理程序 。因为在任何特殊的事件处理程序被调用前,都会调用event()。重新实现这个方法,可以允许我们处理那些不能在某一特定事件处理程序(如对Tab键焦点转换行为的重新定义)中处理的事件,或者实现那些不存在明确事件处理程序的事件,比如QEvent.ToolBarChange。当需要重新实现这些处理程序时,可以对所有其它不是自己亲自处理的事件调用它们的基类的实现。

代码语言:javascript
复制
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_())
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档