【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.rhkb.cn/news/175326.html

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

相关文章

C#学习相关系列之多线程---ConfigureAwait的用法

一、ConfigureAwait的作用 ConfigureAwait方法是Task类中的一个实例方法,它用于配置任务的运行上下文。运行上下文指的是任务在执行期间所处的环境,包括线程、同步上下文等。ConfigureAwait方法接受一个布尔值参数,用于决定是否捕获上下文。当…

python练习(猜数字,99乘法表)

python练习(猜数字&#xff0c;99乘法表) 猜数字 import random num1random.choice(range(1,101))for i in range(11):num2input("plz input a number:")num2int(num2)if num1<num2:print("太大了&#xff0c;小一点")elif num1>num2:print("…

关闭谷歌浏览器的自动更新 详细教程

1.前往资源库找到Google文件夹 2.进入找到GoogleSoftwareUpdate.bundle 并且删除 弹出删除框 需要我们使用指纹或者锁屏密码 就可以删除了 3.打开谷歌浏览器查看是否已经不再自动更新了 发现上面提示更新失败即可 将不会再次更新 window/其他电脑关闭自动更新教程参考&#x…

游戏在小米设备上因自适应刷新率功能,帧率减半

1&#xff09;游戏在小米设备上因自适应刷新率功能&#xff0c;帧率减半 2&#xff09;Lua在计算时出现非法值&#xff0c;开启Debugger之后不再触发 3&#xff09;如何在Unity中实现液体蔓延的效果 这是第357篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&…

[MySQL]——SQL预编译、动态sql

键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 一、SQL的预编译 &#x1f4d5;一条SQL语句的执行过程 &#x1f4d5;弊端 &#x1f4d5;预编译SQL的优势 &#x1f4d5;两种参数占位符 &#x1f4d5;小结 二、动态SQL &#x1f4d5;概念介绍&#xff1a; &#x1f4…

【实用教程】MySQL内置函数

1 背景 在MySQL查询等操作过程中&#xff0c;我们需要根据实际情况&#xff0c;使用其提供的内置函数。今天我们就来一起来学习下这些函数&#xff0c;在之后的使用过程中更加得心应手。 2 MySQL函数 2.1 字符串函数 常用的函数如下&#xff1a; concat(s1,s2,…sn)字符串…

21款奔驰E300L升级HUD抬头显示 直视仪表信息

随着科技飞速地发展&#xff0c;从汽车领域就可以看出&#xff0c;尤其是汽车的抬头显示器&#xff0c;一经推出就吸引了很多的车主。 升级HUD抬头显示&#xff0c;HUD与汽车系统进行完整的数据信息连接&#xff0c;整合成大数据&#xff0c;然后将一些重要信息映射到车窗玻璃上…

Istio实战(九)-Envoy 流量劫持

前言 Envoy 是一款面向 Service Mesh 的高性能网络代理服务。它与应用程序并行运行,通过以平台无关的方式提供通用功能来抽象网络。当基础架构中的所有服务流量都通过 Envoy 网格时,通过一致的可观测性,很容易地查看问题区域,调整整体性能。 Envoy也是istio的核心组件之一…

【【哈希应用】位图/布隆过滤器】

位图/布隆过滤器 位图位图概念位图的使用位图模拟实现 布隆过滤器布隆过滤器概念布隆过滤器的使用布隆过滤器模拟实现 位图/布隆过滤器应用&#xff1a;海量数据处理哈希切分 位图 位图概念 计算机中通常以位bit为数据最小存储单位&#xff0c;只有0、1两种二进制状态&#x…

通过requests库使用HTTP编写的爬虫程序

使用Python的requests库可以方便地编写HTTP爬虫程序。以下是一个使用requests库的示例&#xff1a; import requests# 发送HTTP GET请求 response requests.get("http://example.com")# 检查响应状态码 if response.status_code 200:# 获取响应内容html response.…

JDBC-Java程序连接关系型数据库的技术,ORM编程思想

一、JDBC介绍&#xff1a; 1.操作数据库的方式 1.通过命令行的方式操作mysql服务&#xff0c;cmd通过命令操作 2.通过图形化界面操作mysql服务&#xff0c;例如navicat软件 3.通过java程序连接操作mysql数据库&#xff0c;使用jdbc技术 2.什么是JDBC JDBC(Java Data Base Con…

ICC2: 如何在显示GUI操作产生的命令

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 ICC2&#xff1a;自定义快捷键和菜单 VIEW -> Perference -> Global Settings 把display commands in logging console 下面几个都勾上即可。

PicoDiagnostics (NVH设备软件)-Mongoose识别不了VIN码

如果Mongoose J2534诊断线识别不到车辆的VIN码&#xff0c;通常在PD软件中会像下图那样提示。 遇到这种情况&#xff0c;首先确保你的电脑是否已经安装J2534驱动&#xff1a;打开【设备管理器】&#xff0c;如果你将示波器和Mongoose J2534诊断线连接到电脑&#xff0c;【设备管…

C语言数组首地址学习1

C语言数组名也是数组首地址&#xff1b;数组首地址&#xff0c;也就是数组首元素地址&#xff1b; 数组首地址也可以用第0个元素加&表示&#xff0c;数值a的首地址是&a[0]&#xff1b; #include <stdio.h> int main(){int nums[5];int i;//从控制台读取用户输…

云服务器 centos 部署 code-server 并配置 c/c++ 环境

将你的云服务器改为 centos 8 为什么要将云服务器的操作系统改成 centos 8 呢&#xff1f;原因就是 centos 7 里面的配置满足不了 code-server 的需求。如果你使用的是 centos 7 那么就需要你升级一些东西&#xff0c;这个过程比较麻烦。我在 centos 7 上面运行 code-server 的…

NSGA-II 遗传多目标算法(python示例)

一、前言 最近在准备毕业论文&#xff0c;研究了一下主流的多目标算法&#xff0c;对于NSGA-II&#xff0c;网上大部分代码是全部是面向过程来实现的&#xff0c;本人更喜欢采用面向对象的方式&#xff0c;故采用python面向对象实现了一个示例&#xff0c;实现了对于二元多目标…

iOS iGameGuardian修改器检测方案

一直以来&#xff0c;iOS 系统的安全性、稳定性都是其与安卓竞争的主力卖点。这要归功于 iOS 系统独特的闭源生态&#xff0c;应用软件上架会经过严格审核与测试。所以&#xff0c;iOS端的作弊手段&#xff0c;总是在尝试绕过 App Store 的审查。 常见的 iOS 游戏作弊&#xf…

jenkins工具系列 —— 删除Jenkins JOB后清理workspace

文章目录 问题现象分析解决思路脚本实现问题现象分析 Jenkins使用过程中,占用空间最大的两个位置: 1 、workspace: 工作空间,可以随便删除,删除后再次构建时间可能会比较长,因为要重新获取一些资源。 2 、job: 存放的是项目的配置、构建结果、日志等。不建议手动删除,…

深度学习_2 数据操作

数据操作 机器学习包括的核心组件有&#xff1a; 可以用来学习的数据&#xff08;data&#xff09;&#xff1b;如何转换数据的模型&#xff08;model&#xff09;&#xff1b;一个目标函数&#xff08;objective function&#xff09;&#xff0c;用来量化模型的有效性&…

如何在Instagram和kol展开合作

网红营销已经演变成一个由品牌、MCN机构、红人和消费者组成的复杂生态系统&#xff0c;并在某种程度上重新定义了当今社交媒体时代营销和广告的本质。在这个情况下&#xff0c;品牌找红人进行营销推广已经成为大势&#xff0c;而最能体现网红营销发展的莫过于Instagram这个平台…