在第六篇中已经学习过了自定义信号的相关内容了,那一篇中讲的是自定义类中的自定义信号,类和信号都是自己定义的。那么今天想要学习的是事件处理和信号的关系。如同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. pytest skip的使用

    skip跳过用例(无条件跳过,不运行用例) 使用方法: 1.使用跳过装饰器 class TestClass(): @pytest.mark.skip(reason='no way of current ...

  2. 利用 Bean Validation 来简化接口请求参数校验

    团队新来了个校招实习生静静,相互交流后发现竟然是我母校同实验室的小学妹,小学妹很热情地认下了我这个失散多年的大湿哥,后来... 小学妹:大湿哥,咱们项目里的 Controller 怎么都看不到参数校验 ...

  3. MySQL 最佳实践 —— 高效插入数据

    当你需要在 MySQL 数据库中批量插入数百万条数据时,你就会意识到,逐条发送 INSERT 语句并不是一个可行的方法. MySQL 文档中有些值得一读的 INSERT 优化技巧. 在这篇文章里,我将 ...

  4. 玩转STM32MP157- 在应用层中使用 fbtft

    fbtft使用的是framebuffer框架,这种框架将显示设备抽象为帧缓冲区,对framebuffer设备(/dev/fbx(0.1.2..))进行相关操作可以反应到LCD上. 现在尝试下在用户空间 ...

  5. HTTPD之二————HTTPD服务详解————httpd的配置文件常见设置

    HTTPD之二----HTTPD服务详解----httpd的配置文件常见设置 HTTP服务器应用 http服务器程序 httpd apache nginx lighttpd 应用程序服务器 IIS,a ...

  6. AcWing 1252. 搭配购买

    #include<bits/stdc++.h> #define N 10010 using namespace std; int fa[N],v[N],pr[N]; int vv[N],p ...

  7. 其他:IDEA插件无法安装——网络代理设置

    1.网络代理设置 IDEA配置代理,是在File-> Setting-> plugins中设置 查看自己主机的IP地址 文章转载至:https://www.jianshu.com/p/62 ...

  8. mysql json_extract函数获取json字段中某个key的值

    参考:https://www.cnblogs.com/chuanzhang053/p/9139624.html json_extract函数可以获取json对象中指定key的值,用法:json_ext ...

  9. angular小记

    declarations:包装组件或指令等 providers:依赖注入 imports:导入其他模块 bootstrap:设置根组件 exports:导出组件或指令等 app.component.t ...

  10. 测试基础(三) Jmeter安装

    前言 JMeter是Apache组织开发的基于Java的压力测试工具,用于对软件做压力测试. 进入Jmeter官网:https://jmeter.apache.org/,进行Jmeter压缩包的下载. ...