在第六篇中已经学习过了自定义信号的相关内容了,那一篇中讲的是自定义类中的自定义信号,类和信号都是自己定义的。那么今天想要学习的是事件处理和信号的关系。如同Label标签,它本身有很多的信号,但是它没有当鼠标双击时的事件。那么我们想要实现效果,就要自己写一个label对象,让它添加这个功能。

效果图:

play.py

#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
"""=================================================
@Project -> File : Operate_system_ModeView_structure -> play.py
@IDE : PyCharm
@Author : zihan
@Date : 2020/5/4 11:16
@Desc :
================================================="""
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel
from PyQt5.QtCore import pyqtSignal
from ui_play import Ui_Form class QmyLabel(QLabel):
double_clicked = pyqtSignal() # 自定义信号 def mouseDoubleClickEvent(self, event): # 双击事件的处理
self.double_clicked.emit() class QmyWidget(QWidget):
def __init__(self, parent=None):
super().__init__(parent) # 调用父类构造函数
self.ui = Ui_Form() # 创建UI对象
self.ui.setupUi(self) # 构造UI # # ===================事件处理函数
self.origin = True # 是否是原始标签
self.mylabel = QmyLabel(self)
self.mylabel.setText("双击测试标签")
font = self.mylabel.font()
font.setPointSize(18)
font.setBold(True)
self.mylabel.setFont(font)
label_size = self.mylabel.sizeHint()
width_widget = self.width()
height_widget = self.height()
self.mylabel.setGeometry(int((width_widget - label_size.width()) / 2),
int((height_widget - label_size.height()) / 2),
label_size.width(), label_size.height())
self.mylabel.double_clicked.connect(self.do_mylabel_double_clicked) def do_mylabel_double_clicked(self):
if self.origin:
self.mylabel.setText("已经被双击了")
self.origin = False
else:
self.mylabel.setText("双击测试标签")
self.origin = True if __name__ == '__main__':
app = QApplication(sys.argv) # 创建app
form = QmyWidget()
form.show()
sys.exit(app.exec_())

QmyLabel是继承于QLabel的,只是在QLabel的基础上添加了鼠标双击事件处理的功能。

那么,如果要进一步区分是左键双击还是右键双击,可以用下面的类。

class QmyLabel(QLabel):
left_double_clicked = pyqtSignal() # 自定义信号
right_double_clicked = pyqtSignal() # 自定义信号 def mouseDoubleClickEvent(self, event): # 双击事件的处理
if event.button() == Qt.LeftButton:
self.left_double_clicked.emit()
elif event.button() == Qt.RightButton:
self.right_double_clicked.emit()

常用的默认事件处理函数:

默认函数名称 触发时机 参数event类型
mousePressEvent 鼠标按键按下时触发 QMouseEvent
mouseReleaseEvent 鼠标按键释放时触发 QMouseEvent
mouseMoveEvent 鼠标移动时触发 QMouseEvent
mouseDoubleClickEvent 鼠标双击时触发 QMouseEvent
keyPressEvent 键盘按键按下时触发 QKeyEvent
keyReleaseEvent 键盘按键释放时触发 QKeyEvent
paintEvent 在界面需要重新绘制时触发 QPaintEvent
closeEvent 一个窗体关闭时触发 QCloseEvent
showEvent 一个窗体显示时触发 QShowEvent
hideEvent 一个窗体隐藏时触发 QHideEvent
resizeEvent 组件改变大小时触发,如一个窗口改变大小时 QResizeEvent
focusInEvent 当一个组件获得键盘焦点时触发,如一个QLineEdit组件获得输入焦点 QFocusEvent
focusOutEvent 当一个组件失去焦点时触发,如一个QLineEdit组件失去输入焦点 QFocusEvent
enterEvent 当鼠标进入组件的屏幕空间时触发,如鼠标移动到一个QPushButton组件上 QEvent
leaveEvent 当鼠标离开组件的屏幕空间时触发,如鼠标离开一个QPushButton组件 QEvent
dragEnterEvent 拖动操作正在进行,鼠标移动到组件上方时触发 QDragEnterEvent
dragLeaveEvent 拖动操作正在进行,鼠标移出组件上方时触发 QDragLeaveEvent
dragMoveEvent 拖动操作正在进行,鼠标移动时触发 QDragMoveEvent
dropEvent 当拖动操作在某个组件上发下时触发 QDropEvent

可以在自己的自定义类中使用这些事件。

第二十二篇 -- 事件与信号(自定义label信号的双击功能)的更多相关文章

  1. Python开发【第二十二篇】:Web框架之Django【进阶】

    Python开发[第二十二篇]:Web框架之Django[进阶]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...

  2. Python之路【第二十二篇】CMDB项目

    浅谈ITIL TIL即IT基础架构库(Information Technology Infrastructure Library, ITIL,信息技术基础架构库)由英国政府部门CCTA(Central ...

  3. Python之路【第二十二篇】:Django之Model操作

    Django之Model操作   一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bi ...

  4. Python之路(第二十二篇) 面向对象初级:概念、类属性

    一.面向对象概念 1. "面向对象(OOP)"是什么? 简单点说,“面向对象”是一种编程范式,而编程范式是按照不同的编程特点总结出来的编程方式.俗话说,条条大路通罗马,也就说我们使 ...

  5. 【Python之路】第二十二篇--Django【基础篇】

    1 Django流程介绍 MTV模式       著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业 ...

  6. 第二十二篇、IO多路复用 一

    一.简介io多路复用 可以监听多个文件描述符(socket对象)(文件句柄),一旦文件句柄出现变化,就会感知到 Linux中的 select,poll,epoll(内核2.6以上) 都是IO多路复用的 ...

  7. 第二十二篇 jQuery 学习4 内容和属性

    jQuery 内容和属性   这节课,我们学习使用jQuery来控制元素的内容.值和属性.   html() 控制所选元素的内容(包括HTML标记): text() 控制所选元素的内容: val() ...

  8. flask第二十二篇——模板【4】过滤器

    请关注微信公众号:自动化测试实战 先来教大家一个pycharm设置默认模板的方法.我们每次新建模板或者平时写代码打开以后可能都要重复写# coding: utf-8这些代码,其实我们可以设置好模板,让 ...

  9. SpringBoot非官方教程 | 第二十二篇: 创建含有多module的springboot工程

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springbot22-modules/ 本文出自方志朋的博客 这篇文 ...

随机推荐

  1. UF_EVAL 曲线或边分析

    Open C UF_EVAL_ask_arc  圆形曲线或边分析,得到曲线或边的信息UF_EVAL_ask_ellipse  椭圆曲线或边分析,得到曲线或边的信息UF_EVAL_ask_hyperbo ...

  2. Django(67)drf搜索过滤和排序过滤

    前言 当我们需要对后台的数据进行过滤的时候,drf有两种,搜索过滤和排序过滤. 搜索过滤:比如我们想返回sex=1的,那么我们就可以从所有数据中进行筛选 排序过滤:比如我们想对价格进行升序排列,就可以 ...

  3. 精尽Spring Boot源码分析 - 日志系统

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  4. WEB与游戏开发的一些区别

    WEB与游戏开发的一些区别 前言 ​ 最近由于在准备期末考,以及准备实习.其实都没好好写过博客,但今天由于个人身边的一些事,所以对做web和做游戏开发的区别做个记录,以下都是从网上搜索到的资料文章,感 ...

  5. 闲聊,Python中的turtle

    写在前面 其实我也不知道为什么我会写这个,本文涉及信号与传递,Python 正题 近期看到一个3年前的视频,1000个圆一笔画出一个Miku 在观看完源码了以后,我发现这是这调用的是基本的goto,用 ...

  6. java_线程创建的三种方式及区别

    java中关于线程的创建有三种: (1)通过继承Thread类创建线程. (2)通过实现Runnable接口创建线程. (3)通过Callable 和 Future 接口创建线程. * * * * * ...

  7. Springboot:单元测试Junit基本注解@BeforeClass、@AfterClass、@Before、@After、@Test、

    一.unit中集中基本注解,是必须掌握的. @BeforeClass – 表示在类中的任意public static void方法执行之前执行 @AfterClass – 表示在类中的任意public ...

  8. 在idea的控制台中中文显示为乱码

    显示乱码的原因不一定相同 我目前解决方法: -Dfile.encoding=UTF-8

  9. webView远程代码执行漏洞复现

    一.概述 这个漏洞只存在于Android API level 16以及之前的版本,系统没有限制使用webView.addJavascriptInterface方法,导致攻击者可以通过使用java 反射 ...

  10. 分享一份550多个Linux命令的文档,按照命令首字母索引排序

    输入一个命令,让我给你一个关于它的完美解释! 众所周知,Linux命令是IT人必须掌握的一个技能,有了它,我们可以部署和维护各种各样的服务和应用.但是,大部分的Linux命令我们不一定记得住,而别是各 ...