【PyQt学习篇 · ⑥】:QWidget - 事件

文章目录

  • 事件消息
    • 显示和关闭事件
    • 移动事件
    • 调整大小事件
    • 鼠标事件
      • 进入和离开事件
      • 鼠标按下和释放事件
      • 鼠标双击事件
      • 鼠标按下移动事件
    • 键盘事件
    • 焦点事件
    • 拖拽事件
    • 绘制事件
    • 改变事件
    • 右键菜单
    • 输入法
  • 事件转发机制
  • 案例一
  • 案例二
  • 案例三

事件消息

显示和关闭事件

  1. showEvent(QShowEvent)方法:

    • showEvent()方法在窗口即将显示时被调用。
    • 它的参数QShowEvent可以提供一些有关显示事件的信息。
    • 可以通过重写showEvent()方法来执行一些在窗口显示前需要初始化的操作。
  2. closeEvent(QCloseEvent)方法:

    • closeEvent()方法在窗口即将关闭时被调用。
    • 它的参数QCloseEvent可以提供一些有关关闭事件的信息。
    • 可以通过重写closeEvent()方法来执行一些在窗口关闭前需要处理的操作,例如保存数据或询问用户是否确认关闭窗口。

以下是一个使用showEvent()closeEvent()的示例代码:

from PyQt5.QtWidgets import *
import sysclass MyWindow(QWidget):def __init__(self, parent=None):super().__init__(parent)def showEvent(self, QShowEvent):print('窗口被显示出来')def closeEvent(self, QCloseEvent):print('窗口被关闭')if __name__ == '__main__':app = QApplication(sys.argv)window = MyWindow()window.show()sys.exit(app.exec_())

运行结果:

在这里插入图片描述

移动事件

moveEvent(QMoveEvent)方法:

  • moveEvent()方法在窗口移动时被调用。
  • 它的参数QMoveEvent提供了有关移动事件的详细信息,包括窗口的新位置。

以下是一个使用moveEvent()的示例代码:

def moveEvent(self, QMoveEvent):print("窗口被移动了")

运行结果:

在这里插入图片描述

调整大小事件

resizeEvent(QResizeEvent)方法:

  • resizeEvent()方法在窗口调整大小时被调用。
  • 它的参数QResizeEvent提供了有关调整大小事件的详细信息,包括窗口的新大小。

以下是一个使用resizeEvent()的示例代码:

def resizeEvent(self, QResizeEvent):print('窗口大小被调整了')

运行结果:

在这里插入图片描述

鼠标事件

进入和离开事件

  1. enterEvent(QEvent)方法:

    • enterEvent()方法在鼠标进入窗口时被调用。
    • 它的参数QEvent提供了有关进入事件的详细信息。
    • 可以通过重写enterEvent()方法来执行一些在鼠标进入窗口时需要的操作,例如更改鼠标的样式或显示一些提示信息。
  2. leaveEvent(QEvent)方法:

    • leaveEvent()方法在鼠标离开窗口时被调用。
    • 它的参数QEvent提供了有关离开事件的详细信息。
    • 可以通过重写leaveEvent()方法来执行一些在鼠标离开窗口时需要的操作,例如清除鼠标的样式或隐藏提示信息。

以下是一个使用enterEvent()leaveEvent()的示例代码:

# 鼠标进入控件时背景改为红色
def enterEvent(self, QEnterEvent):self.setStyleSheet("background-color: red;")# 鼠标离开控件时背景改为蓝色
def leaveEvent(self, QLeaveEvent):self.setStyleSheet("background-color: blue;")

运行结果:
如下图所示,左图为鼠标离开控件时,右图为进入控件时。

在这里插入图片描述

鼠标按下和释放事件

  1. mousePressEvent(QMouseEvent)方法:

    • mousePressEvent()方法在鼠标按下时被调用。
    • 它的参数QMouseEvent提供了有关按下事件的详细信息,例如鼠标的位置和按下的按钮。
    • 可以通过重写mousePressEvent()方法来执行一些在鼠标按下时需要的操作,例如捕获鼠标事件、拖拽操作或执行特定的函数。
  2. mouseReleaseEvent(QMouseEvent)方法:

    • mouseReleaseEvent()方法在鼠标释放时被调用。
    • 它的参数QMouseEvent提供了有关释放事件的详细信息,例如鼠标的位置和释放的按钮。
    • 可以通过重写mouseReleaseEvent()方法来执行一些在鼠标释放时需要的操作,例如处理点击事件、完成拖拽操作或执行特定的函数。

以下是一个使用mousePressEvent()mouseReleaseEvent()的示例:

def mousePressEvent(self, QMouseEvent):print('鼠标被按下')def mouseReleaseEvent(self, QMouseEvent):print('鼠标被松开')

运行结果:

在这里插入图片描述

鼠标双击事件

mouseDoubleClickEvent(QMouseEvent)方法:

  • mouseDoubleClickEvent()方法在鼠标双击时被调用。
  • 它的参数QMouseEvent提供了有关双击事件的详细信息,例如鼠标的位置和按下的按钮。
  • 可以通过重写mouseDoubleClickEvent()方法来执行一些在鼠标双击时需要的操作,例如打开新的窗口、执行特定函数或处理双击事件。

以下是一个使用mouseDoubleClickEvent(QMouseEvent)的示例:

def mouseDoubleClickEvent(self, QMouseEvent):print("鼠标双击了")

运行结果:

在这里插入图片描述

鼠标按下移动事件

mouseMoveEvent(QMouseEvent)方法:

  • mouseMoveEvent()方法在鼠标按下并移动时被调用。
  • 它的参数QMouseEvent提供了有关鼠标移动事件的详细信息,例如鼠标的位置和按下的按钮。
  • 可以通过重写mouseMoveEvent()方法来执行一些在鼠标按下并移动时需要的操作,例如实现拖拽操作、更新鼠标位置信息或调整窗口大小。

在上一篇文章已介绍其使用方法,在这里就不赘述。

键盘事件

  1. keyPressEvent(QKeyEvent)方法:

    • keyPressEvent()方法在键盘按下时被调用。
    • 它的参数QKeyEvent提供了有关按键事件的详细信息,例如按键的键码。
    • 可以通过重写keyPressEvent()方法来执行一些在按键按下时需要的操作,例如捕获按键事件并执行特定的函数或根据按键执行相应的操作。
  2. keyReleaseEvent(QKeyEvent)方法:

    • keyReleaseEvent()方法在键盘释放时被调用。
    • 它的参数QKeyEvent提供了有关键盘释放事件的详细信息,例如释放的按键的键码。
    • 可以通过重写keyReleaseEvent()方法来执行一些在按键释放时需要的操作,例如根据按键的组合键执行操作或执行特定函数。

以下是一个使用keyPressEvent()keyReleaseEvent()的示例代码:

def keyPressEvent(self, QKeyEvent):print('键盘被按下')def keyReleaseEvent(self, QKeyEvent):print('键盘松开')

运行结果:
按下两次空格后的结果。

在这里插入图片描述

焦点事件

  1. focusInEvent(QFocusEvent) 方法:

    • focusInEvent() 方法在控件获取焦点时被调用。
    • 可以通过重写 focusInEvent() 方法来执行一些在控件获取焦点时需要的操作,例如更改控件的外观或更新与控件相关的属性。
  2. focusOutEvent(QFocusEvent) 方法:

    • focusOutEvent() 方法在控件失去焦点时被调用。
    • 可以通过重写 focusOutEvent() 方法来执行一些在控件失去焦点时需要的操作,例如更新控件的状态或执行校验操作。

拖拽事件

在 PyQT 中,你可以通过在控件上实现一些拖拽事件处理函数来实现拖拽功能,其中包括以下几个 API:

  1. dragEnterEvent(QDragEnterEvent) 方法:

    • dragEnterEvent() 方法在拖拽对象进入控件时被调用。
    • 可以通过重写 dragEnterEvent() 方法来指定控件支持的拖拽操作类型。
  2. dragMoveEvent(QDragMoveEvent) 方法:

    • dragMoveEvent() 方法在拖拽对象在控件内移动时被调用。
    • 可以通过重写 dragMoveEvent() 方法来修改控件的外观以提供反馈。
  3. dragLeaveEvent(QDragLeaveEvent) 方法:

    • dragLeaveEvent() 方法在拖拽对象离开控件时被调用。
    • 可以通过重写 dragLeaveEvent() 方法来恢复控件原来的外观。
  4. dropEvent(QDropEvent) 方法:

    • dropEvent() 方法在拖拽操作完成并释放鼠标时被调用。
    • 可以通过重写 dropEvent() 方法来执行一些特定的功能,例如处理拖拽数据并更新控件状态。

绘制事件

在 PyQT 中,你可以通过在控件上实现一些绘制事件处理函数来实现控件的外观和样式的自定义,其中包括以下几个 API:

paintEvent(QPaintEvent) 方法:

  • paintEvent() 方法在控件需要绘制时被调用。
  • 可以通过重写 paintEvent() 方法来绘制自定义的控件外观和样式。

改变事件

changeEvent(QEvent) 方法:

  • changeEvent() 方法在控件的状态发生改变时被调用。
  • 它的参数 QEvent 提供了有关状态变化的详细信息,例如当前输入法的变化、窗口状态的变化等。
  • 可以通过重写 changeEvent() 方法来响应这些状态变化,并且更新控件的外观和样式。

右键菜单

contextMenuEvent(QContextMenuEvent) 方法:

  • contextMenuEvent() 方法在右键单击控件时被调用。
  • 它的参数 QContextMenuEvent 提供了有关右键单击事件的详细信息。
  • 可以通过重写 contextMenuEvent() 方法来显示一个自定义的右键菜单。

输入法

inputMethodEvent(QInputMethodEvent) 方法:

  • inputMethodEvent() 方法在输入法发生变化时被调用。
  • 它的参数 QInputMethodEvent 提供了有关输入法变化的详细信息。
  • 可以通过重写 inputMethodEvent() 方法来响应输入法变化,并更新控件的外观和样式。

事件转发机制

在 PyQt 中,事件转发(Event Forwarding)机制允许控件将接收到的事件传递给其他控件进行处理。这种机制可以使用 event() 方法来实现。

当一个控件接收到一个事件时,它会首先调用自己的 event() 方法进行事件处理。如果控件不处理该事件,或者希望将事件传递给其他控件进行处理,它可以调用 super().event(event) 将事件转发给父类控件来处理。

以下为事件转发的示例:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sysclass Window(QWidget):def mousePressEvent(self, QMouseEvent):print('顶层窗口被按下')class MidWindow(QWidget):def mousePressEvent(self, QMouseEvent):print('中间控件被按下')class Label(QLabel):def mousePressEvent(self, QMouseEvent):print('标签控件被按下')if __name__ == '__main__':app = QApplication(sys.argv)window = Window()window.setWindowTitle('事件转发机制')window.resize(500, 500)mid_window = MidWindow(window)mid_window.resize(300, 300)mid_window.setAttribute(Qt.WA_StyledBackground, True)   # 让样式生效mid_window.setStyleSheet('background-color: yellow;')label = Label(mid_window)label.setText('我是标签')label.move(100, 100)label.setStyleSheet('background-color: red;')window.show()sys.exit(app.exec_())

运行结果:

在这里插入图片描述
当注释掉以下代码:

class Label(QLabel):pass#def mousePressEvent(self, QMouseEvent):#print('标签控件被按下')

在标签位置按下鼠标时,打印“中间控件被按下”,说明鼠标按下事件分发到了父类,即MidWindow
运行结果:

在这里插入图片描述

案例一

案例一:创建一个窗口包含一个标签。

要求:鼠标进入标签时,展示“欢迎光临”;鼠标离开标签时,展示“谢谢惠顾”。

案例一的代码:

from PyQt5.QtWidgets import *
import sysclass Label(QLabel):def enterEvent(self, QEnterEvent):self.setText('欢迎光临')def leaveEvent(self, QLeaveEvent):self.setText('谢谢惠顾')if __name__ == '__main__':app = QApplication(sys.argv)window = QWidget()window.setWindowTitle('案例一')window.resize(500, 500)label = Label(window)label.setGeometry(100, 100, 300, 300)label.setStyleSheet('background-color: cyan;')window.show()sys.exit(app.exec_())

运行结果:

在这里插入图片描述

案例二

案例二:创建一个窗口,监听用户按键。

要求:

  • 监听用户输入Tab键
  • 监听用户输入Ctrl+S组合键
  • 监听用户输入Ctrl+Shift+A

补充:
修饰键:

  • Qt.NoModifier:没有修饰键
  • Qt.ShiftModifier:Shift键被按下
  • Qt.ControlModifier:Ctrl键被按下
  • Qt.AltModifier:Alt键被按下
  • ……
  • 多个修饰键之间使用或运算

普通键:

  • Qt.Key_xxx

以下为案例二的代码:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sysclass Label(QLabel):def __init__(self, parent=None):super().__init__(parent)def keyPressEvent(self, QKeyEvent):if QKeyEvent.key() == Qt.Key_Tab:self.setText('按下Tab键')if QKeyEvent.modifiers() == Qt.ControlModifier and QKeyEvent.key() == Qt.Key_S:self.setText('ctrl + s 被点击')if QKeyEvent.modifiers() == Qt.ControlModifier | Qt.ShiftModifier and QKeyEvent.key() == Qt.Key_A:self.setText('ctrl + Shift + A 被按下')if __name__ == '__main__':app = QApplication(sys.argv)window = QWidget()window.resize(500, 500)window.setWindowTitle('案例二')label = Label(window)label.resize(300, 300)label.move(100, 100)label.setContentsMargins(50, 0, 0, 0)label.setStyleSheet('background-color: cyan;')label.grabKeyboard()    # 捕获键盘window.show()

运行结果:

在这里插入图片描述

案例三

案例三:创建一个窗口,用户区支持脱宅。

要求:鼠标点击了用户区拖拽也可以移动窗口。

分析:

  1. 先获取鼠标按下左键时的位置:mouse_x = evt.globalX()、mouse_y = evt.globalY()
  2. 再获取窗口的坐上角的位置:origin_x = x()、origin_y = y()
  3. 鼠标移动的距离:move_x = evt.globalX()-mouse_x、move_y=evt.globalY()-mouse_y
  4. 窗口该移动的距离:dest_x = origin_x + move_x、dest_y = origin_y + move_y
    在这里插入图片描述

以下为案例三的代码:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sysclass MyWindow(QWidget):def __init__(self, parent=None):super().__init__(parent)self.move_Flag = Falsedef mousePressEvent(self, QMouseEvent):if QMouseEvent.button() == Qt.LeftButton:   # 判断是左键按下self.move_Flag = True# 鼠标第一次按下时的位置self.mouse_x = QMouseEvent.globalX()self.mouse_y = QMouseEvent.globalY()# 窗口左上角的坐标self.origin_x = self.x()self.origin_y = self.y()def mouseMoveEvent(self, QMouseEvent):if self.move_Flag:# 计算移动量move_x = QMouseEvent.globalX() - self.mouse_xmove_y = QMouseEvent.globalY() - self.mouse_y# 移动的位置dest_x = self.origin_x + move_xdest_y = self.origin_y + move_yself.move(dest_x, dest_y)def mouseReleaseEvent(self, QMouseEvent):self.move_Flage = Falseif __name__ == '__main__':app = QApplication(sys.argv)window = MyWindow()window.resize(300, 300)window.setWindowTitle('案例三')window.show()sys.exit(app.exec_())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/129799.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小白如何制作电子画册?看这里,超多画册模板任你挑!

传统纸质版的画册,制作起来即费力又费时,花费还高,想要修改内容还得重新制作,特别麻烦。现在互联网发达,如今已经用上了H5的技术,小白也能快速制作一本翻页电子画册。 只需用FLBOOK,在线就可以制…

Linux的历史与环境

目录 Linux的背景介绍 Linux的时代背景-硅谷模式 计算机发展 UNIX发展历史 Linux诞生的偶然与必然 Linux开源 Linux发行版本 搭建Linux的环境 1.直接安装在物理机上 2.使用虚拟机软件 3.使用云服务器 (1)购买云服务器 (2&#x…

OceanBase:03-集群部署

目录 一、集群规划 二、配置要求 三、部署前配置 1.配置 limits.conf 2.配置 sysctl.conf 3.关闭防火墙 4.关闭 SELinux 5.创建数据目录,修改文件所有者信息 6.设置无密码 SSH 登录 7.安装jdk 四、解压执行安装 五、集群部署 1.OBD命令行部署 2. OBD白…

2019年408真题复盘

紫色标记是认为有一定的思维难度或重点总结 红色标记是这次刷真题做错的 记录自己对题目的一些想法与联系,可能并不太关注题目本身。 分数用时 选择部分 80/8036min大题部分41/7094min总分121130min 摘自知乎老哥:“我做历年真题时,绝大部分…

图数据库Neo4j——SpringBoot使用Neo4j 简单增删改查 复杂查询初步

前言 图形数据库是专门用于存储图形数据的数据库,它使用图形模型来存储数据,并且支持复杂的图形查询。常见的图形数据库有Neo4j、OrientDB等。 Neo4j是用Java实现的开源NoSQL图数据库,本篇博客介绍如何在SpringBoot中使用Neo4j图数据库&…

python连接clickhouse (CK)

Author: tkhywang 2810248865qq.com Date: 2023-11-01 11:28:58 LastEditors: tkhywang 2810248865qq.com LastEditTime: 2023-11-01 11:36:25 FilePath: \PythonProject02\Python读取clickhouse2 数据库数据.py Description: 这是默认设置,请设置customMade, 打开koroFileHead…

【Linux】:Linux开发工具之Linux编辑器vim的使用

🔫1.Linux编辑器-vim使用 📤 vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以…

FPGA_Signal TapII 逻辑分析仪 在线信号波形抓取

FPGA_Signal TapII 逻辑分析仪 在线信号波形抓取 由于一些工程的仿真文件不易产生,所以我们可以利用 quartus 软件自带的 SignalTap 工具对波形进行抓取 对各个信号进行分析处理,让电子器件与FPGA进行正常通讯工作,也验证所绘制的波形图是否一…

【C++】类和对象(中)之拷贝构造与运算符、操作符重载

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》 🌝每一个不曾起舞的日子,都是对生命的辜负 前言 我们继续学习默认成员函数,本篇文…

③ 软件工程CMM、CMMI模型【软考中级-软件设计师 考点】

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ ③ 软件工程CMM、CMMI模型【软考中级-软件设计…

Android 数据恢复的顶级软件分享

人们经常向我们询问有关 Android 数据恢复软件的信息以及它们是否有用。而且,我们给他们讲了两个朋友的故事——凯伦和亚历克斯。他们都丢失了 Android 手机上的一些重要数据。 丢失数据确实是一个令人心碎的时刻,根据丢失的文件,可能会让您…

橙河网络:坏人是怎么形成的?

小A是一个非常热心的人,给谁帮忙,都免费。 大家都说,小 A,实在人呀,哈哈。 小B搬来了,他活多,弄不过来,常找小 A 来帮忙。 小A 每次来帮忙,小B 都给小A一张大团结(100…

oracle (8)Managing Tablespace Data File

目录 一、基础知识 1、表空间和数据文件 2、存储层次结构摘要 3、表空间的类型 4、表空间中的空间管理 5、临时表空间 6、Default Temporary TS 默认临时TS 二、常用实操 1、Creating Tablespaces创建表空间 2、Dictionary-Managed TS 字典管理的表空间 3、Locally …

【idea】生成banner.txt

Spring Boot banner在线生成工具,制作下载英文banner.txt,修改替换banner.txt文字实现自定义,个性化启动banner-bootschool.netSpring Boot banner工具实现在线生成banner,轻松修改替换实现自定义banner,让banner.txt文…

pix2tex - LaTeX OCR 安装使用记录

系列文章目录 文章目录 系列文章目录前言一、安装二、使用三、如果觉得内容不错,请点赞、收藏、关注 前言 项目地址:这儿 一、安装 版本要求 Python: 3.7 PyTorch: >1.7.1 安装:pip install "pix2tex[gui]" 注意&#xff1a…

会声会影2024对比2023变化以及功能对比

全新会声会影2024版本现已登场,小伙伴们相信已经急不可待地想知道2024版到底有哪些新功能。对比2023版本,会声会影2024版本有没有功能的增强?事不宜迟,现在就让我们一起来看看会声会影2024对比2023的变化,包括功能对比…

华为是怎么做全面预算管理的?

大家好,我是老原。 在之前的文章分享中,都穿插着一个很重要但是不被你们重视的的部分,就是预算管理这块。 有很多新手项目经理在做计划的时候,发现自己设备和步骤都不熟悉,根本无从下手,不知道怎么做。 …

XXL-JOB默认accessToken身份绕过RCE漏洞复现 [附POC]

文章目录 XXL-JOB默认accessToken身份绕过RCE漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 XXL-JOB默认accessToken身份绕过RCE漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技术从…

Java--网络通信

1.端口Port: 通常计算机上提供了HTTP,FTP等多种服务,客户机通过不同的端口来确定连接到服务器的哪项服务上。 2.套接字Socket: 套接字Socket用于将应用程序与端口连接起来。套接字是一个假想的链接装置。 3.InetAddress类 java.net包中的Ine…

VSCode 如何设置背景图片

VSCode 设置背景图片 1.打开应用商店,搜索 background ,选择第一个,点击安装。 2. 安装完成后点击设置,点击扩展设置。 3.点击在 settings.json 中编辑。 4.将原代码注释后,加入以下代码。 // { // "workben…