PyQt——事件处理

2023-05-16

PyQt事件处理

  • 前言
  • 1 低级的事件处理程序
  • 2 事件处理机制
    • 1、事件机制与信号槽机制的区别
    • 2、事件处理的方法
    • 3、事件处理实例


前言

1 低级的事件处理程序

在这里插入图片描述

# -*- coding: utf-8 -*- 
'''
    【简介】
    PyQT5中实时刷新界面例子
 
  
'''

from PyQt5.QtWidgets import QWidget,  QPushButton ,  QApplication ,QListWidget,  QGridLayout 
import sys 
import time

class WinForm(QWidget):  
	
	def __init__(self,parent=None): 
		super(WinForm,self).__init__(parent) 
		self.setWindowTitle("实时刷新界面例子")        
		self.listFile= QListWidget() 
		self.btnStart = QPushButton('开始') 
		layout = QGridLayout(self) 
		layout.addWidget(self.listFile,0,0,1,2) 
		layout.addWidget(self.btnStart,1,1) 
		self.btnStart.clicked.connect( self.slotAdd) 
		self.setLayout(layout)   
		
	def slotAdd(self): 
		for n in range(10): 
			str_n='File index {0}'.format(n) 
			self.listFile.addItem(str_n) 
			QApplication.processEvents() 
			time.sleep(1) 
		
if __name__ == "__main__":  
	app = QApplication(sys.argv)  
	form = WinForm()  
	form.show()  
	sys.exit(app.exec_())

2 事件处理机制

1、事件机制与信号槽机制的区别

PyQt为事件处理提供了高级别的信号槽机制和低级别的事件处理机制,信号槽机制是事件处理机制的高级封装。使用控件时,不用考虑事件处理机制,只需要关心信号槽即可;对于自定义派生控件,必须考虑事件处理机制,根据控件的行为需求重新实现相应的事件处理函数。

2、事件处理的方法

PyQt提供了5种事件处理和过滤方法,分别为:
(1)重新实现事件处理函数
常用的事件处理函数如paintEvent、mouseMoveEvent、mousePressEvent、mouseReleaseEvent等。
(2)重新实现QObject.event事件分发函数
在增加新的事件时,需要重新实现QObject.event方法,并增加新事件的分发路由。
(3)安装事件过滤器
如果对QObject对象调用installEventFilter方法,则为QObject对象安装事件过滤器。QObject对象的所有事件都会先传递到事件过滤器eventFilter函数,在事件过滤器eventFilter函数中可以丢弃或修改某些事件,对感兴趣的事件使用自定义的事件处理机制,对其它事件使用默认事件处理机制。事件过滤机制会对QObject的所有事件进行过滤,因此如果要过滤的事件比较多则会影响程序性能。
(4)在QApplication安装事件过滤器
在QApplication对象安装事件过滤器将会对所有QObject对象的所有事件进行过滤,并且会首先获得事件,即将事件发送给其它任何一个事件过滤器前,都会首先发送给QApplication的事件过滤器。
(5)重新QApplication的notify方法
PyQt使用QApplication对象的notify方法进行分发事件,要想在任何事件过滤器前捕获事件唯一的方法就是重新实现QApplication的notify方法。

3、事件处理实例

QDialog对话框在ESC按键按下时会自动退出,使用事件处理和过滤对按下ESC按键进行处理。
(1)重新实现事件处理函数

import sys
from PyQt5.QtWidgets import QDialog, QApplication
from PyQt5.QtCore import Qt


class Dialog(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)

    # 重新实现keyPressEvent
    def keyPressEvent(self, event):
        if event.key() != Qt.Key_Escape:
            QDialog.keyPressEvent(self, event)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    dialog = Dialog()
    dialog.exec_()

    sys.exit(app.exec_())

(2)重新实现event函数

import sys
from PyQt5.QtWidgets import QDialog, QApplication
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QKeyEvent


class Dialog(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)

    # 重新实现keyPressEvent
    def event(self, event):
        if event.type() == QKeyEvent.KeyPress and event.key() == Qt.Key_Escape:
            return True
        else:
            return QDialog.event(self, event)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    dialog = Dialog()
    dialog.exec_()

    sys.exit(app.exec_())

(3)QObject安装事件过滤器

import sys
from PyQt5.QtWidgets import QDialog, QApplication
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QKeyEvent


class Dialog(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.installEventFilter(self)

    def eventFilter(self, watched, event):
        if event.type() == QKeyEvent.KeyPress and event.key() == Qt.Key_Escape:
            return True
        else:
            return QDialog.eventFilter(self, watched, event)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    dialog = Dialog()
    dialog.exec_()

    sys.exit(app.exec_())

(4)QApplication安装事件过滤器

import sys
from PyQt5.QtWidgets import QDialog, QApplication
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QKeyEvent


class Dialog(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)

    def eventFilter(self, watched, event):
        if event.type() == QKeyEvent.KeyPress and event.key() == Qt.Key_Escape:
            return True
        else:
            return QDialog.eventFilter(self, watched, event)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    dialog = Dialog()
    app.installEventFilter(dialog)
    dialog.exec_()

    sys.exit(app.exec_())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyQt——事件处理 的相关文章

  • 使用 py2exe 隐藏 Python GUI 应用程序的控制台窗口

    我有一个使用 Qt 实际上是 PyQt4 的 Python 程序 当我从 main py 启动它时 我会得到一个控制台窗口和 GUI 窗口 当然 在 Windows 上 然后我用 py2exe 编译我的程序并成功创建 main exe 但是
  • 如何使用表单上的按钮向 QTabWidget 添加选项卡?

    我决定为我的脚本编写视觉形式 这个想法是有一个按钮可以将新选项卡添加到 QTabWidget 它不起作用 我找不到一个好的例子 我使用PyQt5 这是我尝试过的一部分 import sys from PyQt5 QtGui import Q
  • 自定义小部件的占位符

    我正在从 ui 文件加载 QMainWIndow 基础 另外 我有一个自定义小部件 我想将其放置在表单上的某个位置 目前我在 ui 文件中放入了一个空的QVBoxLayout named placeholder 并在 QMainWindow
  • 如何在小部件状态之间实现 QListWidget 项目的一致突出显示?

    我正在使用 PyQT 4 8 3 创建一个带有两个 QListWidget 的对话框 两者都允许多重选择 我发现 如果启用了这些 QListWidget 则仅当 QListWidget 具有焦点时 所选项目才会以蓝色突出显示 如果没有焦点
  • 如何在 Python Qt 应用程序中使用 KDE Okular 的文档视图小部件?

    我正在 Linux 上使用 Qt 4 8 和 PyQt 用 Python 3 4 编写桌面应用程序 有没有办法将 Okular 的 pdf 查看功能作为小部件使用 导入 如果是 怎么办 这对我有用 import sys from PyKDE
  • PyQt:QFileSystemModel 复选框过滤器

    我正在尝试使用 python pyqt 创建一个实用程序来从QFileSystemModel 仅包括已检查的项目 现在我想要控制QFileSystemModel使用文件名 文件类型 文件大小进行过滤的复选框 我如何勾选 取消勾选QFileS
  • 从线程接收数据后pyqt主窗口不断崩溃

    我有一个 QMainWindow 启动 QThread 并等待来自网络的数据 当收到任何数据时更新 UI 问题是 它有时会崩溃 有时不会 我所做的就是启动它并等待数据 这是线程类 class ListenerThread QtCore QT
  • 反转 PyQtGraph 中的 Y 轴

    我正在使用 Python 和 PyQt4 开发一个应用程序 该应用程序根据深度绘制不同的参数 绘图包是 PyQtGraph 因为它具有良好的动画速度特性 由于我正在根据深度进行绘图 因此我想反转 Y 轴 我发现我可以修改PyQtGraph文
  • 分段错误(核心转储),执行线程

    我试图在 python 中运行一个程序 该程序打开一个程序并从其标准输出中读取 当我运行程序代码时 出现分段错误错误 但是当我将代码放入函数 Myfunc 中的线程外时 它可以正常工作 我不明白发生了什么 这是我的代码 class Work
  • pyqt5调用url时处于无响应状态

    我刚刚在 pyqt 中实现了登录 但在调用 url 和获取响应之间 qt 窗口显示无响应状态 谁能建议我如何避免不响应状态 code class Login QDialog def init self height width parent
  • 如何将图标放置到 QLineEdit 上?

    stackoverflow com 网站的右上角有一个带有放大镜头的搜索字段和一个灰色的 搜索 关键字 我想知道是否有可能实现相同的外观QLineEdit 如果是这样那怎么办 QLineEdit lineEdit new QLineEdit
  • QTableView 中的虚拟列?

    我开始学习 Qt4 模型 视图编程 我有初学者问题 我有一个简单的应用程序 其中显示 sqlite 表QTableView class Model QtSql QSqlTableModel def init self parent None
  • 使用 QObject 从 Python 线程发出信号

    我想知道与 QThread 相比 从 QObject 中的常规 python 线程发出信号会产生什么后果 请参阅以下课程 class MyObject QtCore QObject def init self super init sig
  • 如何使用 QWebView 显示 html。 Python?

    如何在控制台中显示 HTML 格式的网页 import sys from PyQt4 QtGui import QApplication from PyQt4 QtCore import QUrl from PyQt4 QtWebKit i
  • PyQt5 的 OpenGL 模块和版本控制问题(调用不正确的 _QOpenGLFunctions_(ver))

    我一直在努力得到PyQt5 helloGL 示例代码 https github com baoboa pyqt5 blob master examples opengl hellogl py编译 当我尝试构建解决方案时 我得到 Traceb
  • PyQt:如何设置组合框项目可检查?

    为了将 GUI 小部件数量保持在最低限度 我需要找到一种方法来为用户提供下拉菜单项的选择 这些菜单项可用于过滤掉 listWidget 项中显示的内容 假设 listWidget 列出了 5 个不同类别的项目 Cat A Cat B Cat
  • 如何编辑 QProgressBar 的样式表

    我无法在我的应用程序中编辑进度条的颜色 仅编辑文本颜色 pyhton 3 9 PySide6 QT Creator 7 0 2 Python应用程序 https i stack imgur com 6hKFI png import sys
  • 如何使用 PyQt 抓取桌面截图?

    我可以使用 PyQt 从桌面或任何窗口截取屏幕截图吗 如何处理桌面上的keyPressEvent Thanks 如何截取桌面屏幕截图的示例 import sys from PyQt4 QtGui import QPixmap QApplic
  • Pyqt5 中的 QThreads:这是官方 QThread 文档的正确 C++ 到 Python 翻译吗?

    关于如何实例化和使用的官方文档QThread可以在这里找到 http doc qt io qt 5 qthread html http doc qt io qt 5 qthread html 该文档描述了两种基本方法 1 工作对象方法和 2
  • PyQt:使用 alpha 通道创建 QPixmap,而不是预乘颜色通道

    我想创建一个 QPixmap 来使用 QPainter 进行绘制 QPixmap 应支持透明度 而不使用预乘颜色通道 目前 我通过创建具有所需尺寸的 QPixmap 并用每个通道 包括 alpha 设置为零的 QColor 填充它来实现此目

随机推荐

  • PyQt——QComboBox

    span class token keyword import span sys span class token keyword from span PyQt5 span class token punctuation span QtCo
  • 目录

    PyQt 目录 第四章 xff1a PyQt5 基本窗口控件 4 5 按钮类控件 QAbastractButtonQPushButtonQRadioButtonQCheckBox 4 6 下拉列表框 QComboBox 4 7 计数器 QS
  • PyQt中常见问题解决

    1 ModuleNotFoundError No module named PyQt5 QtChart sudo apt get install reinstall python3 pyqt5 pip3 install upgrade fo
  • lingo入门教程之一 --- 初识lingo

    lingo对于一些线性或者非线性的规划 xff0c 优化问题非常有效 首先介绍一下 xff0c 在lingo中运行程序时出现的页面 xff08 在工具栏点击类似靶子一样的图标便可运行 xff09 Solver status 求解器 求解程序
  • PyQt——QSpinBox(计数器)

    span class token keyword import span sys span class token keyword from span PyQt5 span class token punctuation span QtCo
  • PyQt——QSlider(滑动条)

    span class token keyword import span sys span class token keyword from span PyQt5 span class token punctuation span QtCo
  • PyQt——QTableView

    span class token keyword from span PyQt5 span class token punctuation span QtWidgets span class token keyword import spa
  • 正则表达式——验证数字

    验证数字 xff1a span class token operator span span class token punctuation span span class token number 0 span span class to
  • PyQt——QTableWidget

    span class token keyword import span sys span class token keyword from span PyQt5 span class token punctuation span QtWi
  • PyQt——QListView

    span class token comment coding utf 8 span span class token triple quoted string string 39 39 39 简介 PyQt5中 QListView 例子
  • PyQt——QListWidget

    span class token comment coding utf 8 span span class token triple quoted string string 39 39 39 简介 PyQt5中 QListWidget 例
  • PyQt——QTabWidget

    span class token comment coding utf 8 span span class token triple quoted string string 39 39 39 简介 PyQt5中 QTabWidget 例子
  • PyQt——QStackedWidget

    span class token comment coding utf 8 span span class token triple quoted string string 39 39 39 简介 PyQt5中 QStackedWidge
  • PyQt——QDockWidget

    span class token comment coding utf 8 span span class token triple quoted string string 39 39 39 简介 PyQt5中 QDockWidget 例
  • lingo入门教程之二 --- 集合运用

    lingo中的集合用法很多 xff0c 这里主要通过几个例题来进行讲解 对于每一个问题 xff0c 都要先找到对应的目标函数 xff0c 然后对相应值进行初始化 xff0c 然后找到约束条件等进行求解 例1 xff1a SAILCO公司需要
  • PyQt——MDI(多文档界面)

    span class token comment coding utf 8 span span class token triple quoted string string 39 39 39 简介 PyQt5中 QMdiArea 例子 3
  • PyQt——QScrollBar

    span class token comment coding utf 8 span span class token triple quoted string string 39 39 39 简介 PyQt5中 QScrollBar 例子
  • PyQt——QTimer

    span class token comment coding utf 8 span span class token triple quoted string string 39 39 39 简介 PyQT5中 QTimer例子 39 3
  • PyQt——QThread

    span class token comment coding utf 8 span span class token triple quoted string string 39 39 39 简介 PyQT5中 QThread 例子 39
  • PyQt——事件处理

    PyQt事件处理 前言1 低级的事件处理程序2 事件处理机制1 事件机制与信号槽机制的区别2 事件处理的方法3 事件处理实例 前言 1 低级的事件处理程序 span class token comment coding utf 8 span