qidao123.com ToB IT社区-企服评测·应用市场

 找回密码
 立即注册

【python】PyQt5事故通报,鼠标动作捕获,键盘按键捕获原理与应用实战

[复制链接]
发表于 2026-2-9 22:53:35 | 显示全部楼层 |阅读模式

✨✨ 接待各人来到景天科技苑✨✨
🎈🎈 养成好风俗,先赞后看哦~🎈🎈
   🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈范畴优质创作者,掘金精良博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小步伐开发,云原生K8S,人工智能,js逆向,App逆向,网络体系安全数据分析,PyQt5,tkinter,Django,fastapi,flask等框架,linux,shell脚本等实操履历,网站搭建,数据库平分享。
  所属的专栏:PyQt5桌面应用开发,零底子到进阶应用实战
景天的主页:景天科技苑
  

1.事故通报

控件消息的处理惩罚是从内到外的,即当前控件对通报来的消息无法处理惩罚时会交给它的父控件举行处理惩罚,假如父控件也无法处理惩罚就交给它的父控件的父控件处理惩罚,…,直到顶层控件也无法处理惩罚则竣事。
当一个控件被触发了一个特定的举动时, 就会调用特定的方法, 来将事故通报给开发职员, 方便处理惩罚
重写这些事故方法, 就可以监听干系的信息
在父子控件之间,可以设置事故是否通报
假如一个控件没有处理惩罚该事故, 则会自动通报给父控件举行处理惩罚
事故对象具备两个特殊方法
accept() 本身处理惩罚了这个事故, 并告诉体系不要再向上层通报
ignore() 本身忽略了这个事故, 告诉体系, 继承今后通报去
(1)事故通报实战

  1. # 0. 导入需要的包和模块
  2. from PyQt5.Qt import *
  3. import sys
  4. class Window(QWidget):
  5.     def mousePressEvent(self, QMouseEvent):
  6.         print("顶层窗口鼠标按下")
  7. #中间的窗口
  8. class MidWindow(QWidget):
  9.     def mousePressEvent(self, evt):
  10.         print("中间控件被按下")
  11.         #判断
  12.         print('中间窗口事件是否被处理',evt.isAccepted())
  13.         #ignore()表示标识事件未处理,继续向父窗口传播
  14.         evt.ignore()
  15. class Label(QLabel):
  16.     def mousePressEvent(self, evt):
  17.         print("标签控件鼠标按下")
  18.         #accept() 表示事件已处理,不需要向父窗口传播,此时,事件就不再向父控件传播
  19.         # evt.accept()
  20.         #查看事件是否被处理状态,默认情况下,当事件被传过来之后,就是被处理状态
  21.         print('标签事件是否被处理',evt.isAccepted())
  22.         # ignore()表示标识事件未处理,继续向父窗口传播
  23.         evt.ignore()
  24.         #此处在查看,事件是未处理状态,会继续向父窗口传播
  25.         # print(evt.isAccepted())
  26. # 1. 创建一个应用程序对象
  27. app = QApplication(sys.argv)
  28. # 2. 控件的操作
  29. # 2.1 创建控件
  30. window = Window()
  31. # 2.2 设置控件
  32. window.setWindowTitle("事件传递")
  33. window.resize(500, 500)
  34. window.setStyleSheet("background-color:green;")
  35. mid_window = MidWindow(window)
  36. mid_window.resize(300, 300)
  37. #默认设置的背景色不生效,需要设置下Qt.WA_StyledBackground
  38. mid_window.setAttribute(Qt.WA_StyledBackground, True)
  39. mid_window.setStyleSheet("background-color: yellow;")
  40. label = Label(mid_window)
  41. # label = QLabel(mid_window)
  42. label.setText("这是一个标签")
  43. label.setStyleSheet("background-color: red;")
  44. label.move(100, 100)
  45. btn = QPushButton(mid_window)
  46. btn.setText("我是按钮")
  47. btn.move(50, 50)
  48. # 2.3 展示控件
  49. window.show()
  50. # 3. 应用程序的执行, 进入到消息循环
  51. sys.exit(app.exec_())
复制代码
点击最中心的标签,当设置了ignore,层层向上通报

其他常用事故API先容

2.鼠标事故捕获案例

创建一个窗口包罗一个标签
鼠标进入标签时, 展示"接待光临"
鼠标脱离标签时, 展示"谢谢光顾"
  1. from PyQt5.Qt import *
  2. #标签类
  3. class Label(QLabel):
  4.     #鼠标进入控件时触发
  5.     def enterEvent(self, QEvent):
  6.         self.setText("欢迎光临")
  7.         self.adjustSize()
  8.     #鼠标离开控件时触发
  9.     def leaveEvent(self, QEvent):
  10.         self.setText("谢谢惠顾")
  11.         self.adjustSize()
  12. if __name__ == '__main__':
  13.     import sys
  14.     app = QApplication(sys.argv)
  15.     window = QWidget()
  16.     window.resize(500,500)
  17.     lable = Label(window)
  18.     lable.move(100,100)
  19.     lable.setStyleSheet("background-color: cyan;")
  20.     window.show()
  21.     sys.exit(app.exec_())
复制代码
鼠标移入标签,表现接待光临

鼠标移出,表现谢谢光顾

3.键盘事故捕获案例

PyQt5键盘事故被频仍处理惩罚。比方,按下F1,表现资助信息;在文本编辑框中,按下回车键,输入核心自动跳到另一控件。下面具体先容键盘事故。
(1)键盘按键API利用方法



  • 修饰键
    Qt.NoModifier 没有修饰键
    Qt.ShiftModifier Shift键被按下
    Qt.ControlModifier Ctrl键被按下
    Qt.AltModifier Alt键被按下
    多个修饰键之间利用按位或运算
  • 平凡键
    key反面字母大写
    Qt.Key_X
按下并开释键时,以下方法将被调用:
keyPressEvent(self,event) - 按下某一键时,该方法被调用直到键被开释为止;
keyReleaseEvent(self,event) - 开释之前按下的键时被调用。event参数为QKeyEvent对象,包罗
事故的干系信息,有以下方法可调用。
key():返回按下键的值;
text():返回按下键的Unicode字符编码信息,当按键为Shift, Control, Alt等时,则该函数返回的字符为空值;
modifiers():判断按下了哪些修饰键(Shift,Ctrl , Alt,等等)。返回值为QtCore.Qt 类以下罗列变量的组合:
NoModifier - 没有修饰键;
ShiftModifier - 修饰键;
ControlModifier - 修饰键;
AltModifier - 修饰键;
MetaModifier - 修饰键;
KeypadModifier - 附加键盘上的任何按键;
GroupSwitchModifier - 按下键(仅限X11体系)。
isAutoRepeat(): 假如不停按着某键,返回True;否则,返回False;
键盘事故函数内里的传参对象有很多方法

此中modifiers方法用来获取修饰键
key用来获取平凡键

(2)键盘按键捕获案例实战

监听用户输入Tab键
监听用户输入Ctrl+S组合键
监听用户输入Ctrl+Shift+S
  1. from PyQt5.Qt import *
  2. #标签类
  3. class Label(QLabel):
  4.     #键盘事件
  5.     # QKeyEvent
  6.     def keyPressEvent(self, QKeyEvent):
  7.         print("用户按键盘了")
  8.         print("当前按下的普通键是",QKeyEvent.key())
  9.         print("当前按下的修饰键是",QKeyEvent.modifiers())
  10.         #QKeyEvent.modifiers()捕捉修饰键。QKeyEvent.key()捕获普通键
  11.         if QKeyEvent.modifiers() == Qt.ControlModifier | Qt.ShiftModifier and QKeyEvent.key() == Qt.Key_S:
  12.             print("用户按下了 Ctrl+Shit+S")
  13.         if QKeyEvent.key() == Qt.Key_Tab:
  14.             print("用户按下了tab键")
  15. if __name__ == '__main__':
  16.     import sys
  17.     app = QApplication(sys.argv)
  18.     window = QWidget()
  19.     window.resize(500,500)
  20.     label = Label(window)
  21.     label.move(100,100)
  22.     label.resize(200,200)
  23.     label.setStyleSheet("background-color: cyan;")
  24.     #需要设置键盘监听,确定是哪个控件监听键盘事件,不然触发不了键盘事件函数
  25.     #捕获键盘,捕获鼠标,捕获手势等都有
  26.     label.grabKeyboard()
  27.     window.show()
  28.     sys.exit(app.exec_())
复制代码
运行,恣意按个空格键

按下ctrl shift s

按下tab键

4.总结

能捕获到键盘和鼠标等装备的动作,就可以定制化实现各种我们须要的功能,好比点击后做什么,按下什么键实行什么利用,都可以开发出来,感爱好的小搭档赶紧实行下吧。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录

QQ|手机版|qidao123.com IT社区;IT企服评测▪应用市场 ( 浙ICP备20004199|浙ICP备20004199号 )|网站地图

GMT+8, 2026-4-17 06:56 , Processed in 0.215048 second(s), 31 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表