PyQt5之事件处理

这篇具有很好参考价值的文章主要介绍了PyQt5之事件处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


事件处理

Widget -> event

基于窗体的应用程序都是由事件驱动的,列如:鼠标事件(鼠标的单击双击)、键盘事件(按键的按下释放)、窗体绘制事件(某个事件的重绘)等,产生的事件进入一个事件队列,由应用程序的事件循环进行处理。


一、事件类型

在PyQt5中,事件是一种对象,由抽象类QEvent表示,开头引入库

from PyQt5.QtCore import QEvent

QEvent有很多子类,表示具体的事件,列如

QMouseEvent,QKeyEvent,QPaintEvent,QCloseEvent,QResizeEvent,etc.

二、event()函数原型

event(self, event)

参数event是QEvent类型。QEvent类有主要以下三个接口:

  • accept(),表示事件接收者接受此事件并进行处理
  • ignore(),表示事件接收者忽略此事件,忽略的事件将传播给上层容器组件
  • type(),返回事件的类型,可以枚举100多个值,也就是100多个类型的事件
# 枚举类型 event.type()的每一个值都对应于一个事件类,这里,event.type()对应的事件类是 QKeyEvent
# 具体的事件类型为键盘的释放 QEvent.KeyRelease 
event.type() == QEvent.KeyRelease 

三、常见的默认事件处理函数

默认函数名称 触发时机 参数event类型
mousePressEvent(self, event) 鼠标按键按下时触发 QMouseEvent
mouseReleaseEvent(self, event) 鼠标按键释放时触发 QMouseEvent
mouseMoveEvent(self, event) 鼠标按键移动时触发 QMouseEvent
mouseDoubleClickEvent(self, event) 鼠标按键双击时触发 QMouseEvent
keyPressEvent(self, event) 键盘按键按下时触发 QKeyEvent
keyReleaseEvent(self, event) 键盘按键释放时触发 QKeyEvent
paintEvent(self, event) 在界面需要重新绘制时触发 QPaintEvent
closeEvent(self, event) 一个窗体关闭时触发 QCloseEvent
resizeEvent(self, event) 组件改变大小时触发 QResizeEvent

代码示例

ui_1009.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'ui_1009.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Widget(object):
    def setupUi(self, Widget):
        Widget.setObjectName("Widget")
        Widget.resize(400, 300)
        self.label = QtWidgets.QLabel(Widget)
        self.label.setGeometry(QtCore.QRect(130, 265, 241, 21))
        self.label.setObjectName("label")
        self.pushButton = QtWidgets.QPushButton(Widget)
        self.pushButton.setGeometry(QtCore.QRect(104, 130, 161, 23))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(Widget)
        self.pushButton_2.setGeometry(QtCore.QRect(110, 180, 151, 23))
        self.pushButton_2.setObjectName("pushButton_2")

        self.retranslateUi(Widget)
        QtCore.QMetaObject.connectSlotsByName(Widget)

    def retranslateUi(self, Widget):
        _translate = QtCore.QCoreApplication.translate
        Widget.setWindowTitle(_translate("Widget", "窗体"))
        self.label.setText(_translate("Widget", "鼠标的当前坐标位置是:"))
        self.pushButton.setText(_translate("Widget", "Button_resizeEvent"))
        self.pushButton_2.setText(_translate("Widget", "Button_moveEvent"))

ui_1009_main.py

# -*- coding: utf-8 -*-
# @Time    : 2022/10/9 11:16
# -*- coding: utf-8 -*-
# @Time    : 2022/10/9 11:16
import sys
from PyQt5.QtWidgets import QWidget, QApplication, QMessageBox
from PyQt5.QtCore import QEvent, Qt, pyqtSlot
from PyQt5.QtGui import QPixmap, QPainter

from ui_1009 import Ui_Widget
class QmyWidget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_Widget()
        self.ui.setupUi(self)

    # 典型事件的默认处理函数
    # 组件改变大小事件
    def resizeEvent(self, event):
        H = self.height()
        W = self.width()
        Hbtn = self.ui.pushButton.height()
        Wbtn = self.ui.pushButton.width()
        # self.ui.pushButton.setGeometry((H-Hbtn)/2 , (W-Wbtn)/2, Hbtn, Wbtn)
        # 从屏幕上((W - Wbtn) / 2, (H - Hbtn) / 2)位置开始(即为最左上角的点),显示一个Wbtn*Hbtn的界面(宽Wbtn,高Hbtn)
        self.ui.pushButton.setGeometry((W - Wbtn) / 2, (H - Hbtn) / 2, Wbtn, Hbtn)

    def mousePressEvent(self, event):
        pt = event.pos() # 鼠标的位置
        if (event.button() == Qt.LeftButton): # button()函数:返回值是枚举类型Qt.MouseButton, 表示哪个按键(Qt.LeftButton、Qt.RightButton等)被按下
            self.ui.label.setText("鼠标的当前坐标位置是:(%d,%d)"% (pt.x(),pt.y()))
        super().mousePressEvent(event)

    # 自定义键盘按键按下触发事件
    def keyPressEvent(self, event):
    # def keyReleaseEvent(self, event):
        rect = self.ui.pushButton_2.geometry()
        if event.key() in set ([Qt.Key_4, Qt.Key_Left]):
            # setGeometry():从屏幕上(rect.left()-20, rect.top())位置开始(即为最左上角的点),显示一个rect.width()*rect.height()的界面(宽rect.width(),高rect.height())
            self.ui.pushButton_2.setGeometry(rect.left()-50, rect.top(), rect.width(), rect.height()) # rect.left()-50 每按下左键一次左移50个像素,使左移加速
        elif event.key() in set ([Qt.Key_6, Qt.Key_Right]):
            self.ui.pushButton_2.setGeometry(rect.left() + 2, rect.top(), rect.width(), rect.height())
        elif event.key() in set ([Qt.Key_8, Qt.Key_Up]):
            self.ui.pushButton_2.setGeometry(rect.left(), rect.top() - 2, rect.width(), rect.height())
        elif event.key() in set ([Qt.Key_2, Qt.Key_Down]):
            self.ui.pushButton_2.setGeometry(rect.left(), rect.top() + 2, rect.width(), rect.height())

    # 重绘触发事件
    def paintEvent(self, event):
        painter = QPainter(self)
        img = QPixmap("./images/img-background.png")
        painter.drawPixmap(0, 0, self.width(), self.height(), img)
        super().paintEvent(event)

    # 窗体关闭事件
    def closeEvent(self, event):
        dlgTitle = "消息对话框"
        strText = "确定要退出么?"
        defaultButton = QMessageBox.NoButton
        result = QMessageBox.question(self, dlgTitle, strText, QMessageBox.Yes | QMessageBox.No, defaultButton)
        if (result == QMessageBox.Yes) :
            event.accept()
        else:
            event.ignore()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    btnevent = QmyWidget()
    btnevent.show()
    sys.exit(app.exec_())
    

运行结果

pyqt5 点击事件,PyQt5 GUI设计,qt,ui,python

四、使用event()函数屏蔽窗体事件

代码示例

    # event函数事件屏蔽/预处理
    def event(self, event):
        if (event.type() == QEvent.Paint):
            return True # 不在绘制背景
        elif (event.type() == QEvent.KeyRelease) and (event.key() == Qt.Key_Tab):
            rect = self.ui.pushButton.geometry()
            self.ui.pushButton.setGeometry(rect.left() + 50, rect.top(), rect.width(), rect.height())
        return super().event(event)

第一个判断:判断的事件类型为 QEvent.Paint,直接返回True,退出函数 。
QEvent.Paint事件类型的默认处理函数是 paintEvent(self, event),用于绘制窗体背景图片。执行该句后,将不会对重新实现的 paintEvent(self, event) 函数做处理,也就不会绘制窗体的背景图片。

第二个判断:判断的事件类型为QEvent.KeyRelease,并且按键是Tab键,按钮右移50个像素,右移加速

运行结果

pyqt5 点击事件,PyQt5 GUI设计,qt,ui,python文章来源地址https://www.toymoban.com/news/detail-670726.html


到了这里,关于PyQt5之事件处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PyQt5 GUI编程

    PyQt5是一个用于创建图形用户界面(GUI)应用程序的跨平台工具集,它将Qt库(广泛用于C++编程语言中创建丰富的GUI应用程序)的功能包装给Python使用者。PyQt5是由Riverbank Computing开发的,并且可以在所有主流操作系统上运行,包含Windows、macOS和Linux。 PyQt5包括了超过620个类和

    2024年03月19日
    浏览(47)
  • python GUI工具之PyQt5模块,pyCharm 配置PyQt5可视化窗口

    https://doc.qt.io/qt-5/qtwidgets-module.html https://doc.qt.io/qt-5/qt.html#AlignmentFlag-enum 一、简介 PyQt是Qt框架的Python语言实现,由Riverbank Computing开发,是最强大的GUI库之一。PyQt提供了一个设计良好的窗口控件集合,每一个PyQt控件都对应一个Qt控件。 PyQt5是由一系列Python模块组成,有超过6

    2024年02月11日
    浏览(54)
  • PyQt5下界面设计, 无边框加阴影界面, 鼠标左键移动事件

            本人小白, 网罗各个网页与资源学习总结的内容, 设置界面无边框且留有阴影, 且鼠标左键可以拖动界面的方法.         首先我们寻找一个模板进行学习演示, 例如腾讯会议的界面:         本人会仿照这个界面进行演示说明, 包括各种样式(你看到就是赚到)      

    2023年04月09日
    浏览(43)
  • Python GUI文章合集(PyQt5)

    我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数据库教程:👉👉 Oracle数据库文章合

    2024年02月12日
    浏览(40)
  • PyQt5学习笔记--加载Qt Designer设计的ui文件

    目录 1--直接加载ui文件 2--动态加载ui文件及其属性 3--绑定槽函数测试 4--登录程序实例练习 ① Qt Designer 下载地址​​​​​ ② 设计ui并保存导出   ③ 直接加载代码 ​ ① 在Qt Designer设计ui文件:   ② 源程序: ③ 结果测试  

    2024年02月10日
    浏览(51)
  • PyQt5 GUI编程界面与函数相连

    在使用PyQt5的时候会出现一些需求 无法用代码一步步实现 ,而用GUI画完窗口之后,又要根据pyUIC5 自动生成的界面的参数 进行编程,这样增加了理解变量所需的时间。我查到了一个解决办法,就是 将界面设计与函数实现分开分别写 ,并用一个巧妙的方法将这俩在代码层面进

    2024年02月05日
    浏览(46)
  • PyQt5 GUI编程(QMainWindow与QWidget模块结合使用)

    QWidget是所有用户界面对象的基类,而QMainWindow 用于创建主应用程序窗口的类。它是 QWidget 的一个子类,提供了创建具有菜单栏、工具栏、状态栏等的主窗口所需的功能。上篇主要介绍了基本使用,创建窗口时都是继承单个模块,本章主要介绍下两个模块的结合使用。 1.我们先

    2024年04月08日
    浏览(77)
  • [pyqt5]触发ctrl+鼠标滚轮事件

    有时候我们需要按住Ctrl+鼠标滚轮实现图像放大或者缩小,因此需要这个事件,具体看代码

    2024年02月13日
    浏览(49)
  • mac python3.9安装pyqt5、qt5、pyqt5-tools

    pyqt6安装参考 PyQT6:看这一篇就够了 python PyQt6 常用操作以及常见问题解决 pycharm配置tools 参考链接 以下pip命令自行更具自己环境选择pip或pip3 在安装pyqt前必须先安装sip包 完成sip的安装后,安装pyqt和pyqt-tools, 可以直接使用命令: 若是使用pip3安装报错 AttributeError: module ‘sipb

    2024年02月14日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包