第二十二篇 -- 事件与信号(自定义label信号的双击功能)
在第六篇中已经学习过了自定义信号的相关内容了,那一篇中讲的是自定义类中的自定义信号,类和信号都是自己定义的。那么今天想要学习的是事件处理和信号的关系。如同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信号的双击功能)的更多相关文章
- Python开发【第二十二篇】:Web框架之Django【进阶】
Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...
- Python之路【第二十二篇】CMDB项目
浅谈ITIL TIL即IT基础架构库(Information Technology Infrastructure Library, ITIL,信息技术基础架构库)由英国政府部门CCTA(Central ...
- Python之路【第二十二篇】:Django之Model操作
Django之Model操作 一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bi ...
- Python之路(第二十二篇) 面向对象初级:概念、类属性
一.面向对象概念 1. "面向对象(OOP)"是什么? 简单点说,“面向对象”是一种编程范式,而编程范式是按照不同的编程特点总结出来的编程方式.俗话说,条条大路通罗马,也就说我们使 ...
- 【Python之路】第二十二篇--Django【基础篇】
1 Django流程介绍 MTV模式 著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业 ...
- 第二十二篇、IO多路复用 一
一.简介io多路复用 可以监听多个文件描述符(socket对象)(文件句柄),一旦文件句柄出现变化,就会感知到 Linux中的 select,poll,epoll(内核2.6以上) 都是IO多路复用的 ...
- 第二十二篇 jQuery 学习4 内容和属性
jQuery 内容和属性 这节课,我们学习使用jQuery来控制元素的内容.值和属性. html() 控制所选元素的内容(包括HTML标记): text() 控制所选元素的内容: val() ...
- flask第二十二篇——模板【4】过滤器
请关注微信公众号:自动化测试实战 先来教大家一个pycharm设置默认模板的方法.我们每次新建模板或者平时写代码打开以后可能都要重复写# coding: utf-8这些代码,其实我们可以设置好模板,让 ...
- SpringBoot非官方教程 | 第二十二篇: 创建含有多module的springboot工程
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springbot22-modules/ 本文出自方志朋的博客 这篇文 ...
随机推荐
- 在centos上安装docker
安装docker 卸载旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docke ...
- 孟老板 ListAdapter封装, 告别Adapter代码 (三)
BaseAdapter系列 ListAdapter封装, 告别Adapter代码 (一) ListAdapter封装, 告别Adapter代码 (二) ListAdapter封装, 告别Adapter ...
- 题解 P3605 [USACO17JAN]Promotion Counting P
分块\(yyds\) ----关于线段树合并的题我用分块过掉这件事 题目传送门 先说正解 正解当然是线段树合并等一类做法了 至于解析...出门右转题解区第一篇 (就是他让我看不懂,然后用分块打的\(Q ...
- gRPC入门—golang实现
1.RPC 1.1 什么是RPC RPC(Remote Procedure Call),即远程过程调用,过程就是方法,简单来说,它就是一种能够像调用本地方法一样调用远程计算机进程中的方法的技术,在这种 ...
- Java小工具类
计时器(秒表),计算程序运行时间用的 public class Stopwatch { private static long startTime=0; private static long end ...
- RPM安装MySQL5.7并更改数据目录
RPM安装MySQL5.7并更改数据目录 文末附MySQL完整配置文件 官网地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads 注意 ...
- 手把手教你IDEA连接码云(Gitee)
目录 前言 一.下载.安装git 1.打开git官网,选择你的操作系统 2.根据你的系统位数选择相应的版本下载 3.安装 4.配置全局的用户名.邮箱 5.在idea中配置git目录 二.配置Gitee ...
- ceph-csi源码分析(7)-rbd driver-IdentityServer分析
更多 ceph-csi 其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 ceph-csi源码分析(7)-rbd driver-IdentityServer分析 当 ...
- 乘风破浪,.Net Core遇见Dapr,为云原生而生的分布式应用运行时
Dapr是一个由微软主导的云原生开源项目,国内云计算巨头阿里云也积极参与其中,2019年10月首次发布,到今年2月正式发布V1.0版本.在不到一年半的时间内,github star数达到了1.2万,超 ...
- Software Architecture软件架构(方法、模式与框架)纵横谈
Software Architecture软件架构是啥 随着软件行业的发展,软件的规模越来越大,"Software Architecture软件架构"这个名词开始频繁出现.&quo ...