第二十二篇 -- 事件与信号(自定义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/ 本文出自方志朋的博客 这篇文 ...
随机推荐
- 关于使用JS去除URL中的指定参数问题,js 对url进行某个参数的删除,并返回url
在网页上找了半天,发现现在的资源实在是少的可怜,而前端尤甚.所以没办法,于是自己花了一些时间写了一个: 1 /** 2 * 删除URL中的指定参数 3 * @param {*} url 4 * @pa ...
- 【题解】coin HDU2884 多重背包
题目 Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- .NET Core/.NET5/.NET6 开源项目汇总10:实用工具
系列目录 [已更新最新开发文章,点击查看详细] 开源项目是众多组织与个人分享的组件或项目,作者付出的心血我们是无法体会的,所以首先大家要心存感激.尊重.请严格遵守每个项目的开源协议后再使用.尊 ...
- 深入学习Netty(1)——传统BIO编程
前言 之前看过Dubbo源码,Nacos等源码都涉及到了Netty,虽然遇到的时候查查资料,后面自己也有私下学习Netty并实践,但始终没有形成良好的知识体系,Netty对想要在Java开发上不断深入 ...
- 4、git和gitlab的配置(1)
4.0.服务器说明: 服务器名称 ip地址 controller-node1 172.16.1.90 4.1.git介绍: 1.git分布式图: 2.git区域: 3.四种状态: 上面的操作在工作目录 ...
- POJ 1556 计算几何 判断线段相交 最短路
题意: 在一个左下角坐标为(0,0),右上角坐标为(10,10)的矩形内,起点为(0,5),终点为(10,5),中间会有许多扇垂直于x轴的门,求从起点到终点在能走的情况下的最短距离. 分析: 既然是求 ...
- Vue 全局组件
全局注册的组件可以在其他组件内直接使用,它在整个Vue实例中都是全局有效的. 非单文件组件中使用 Vue.component('student-list', { template: ` <div ...
- 【知识点】C++的日志框架
常用的 C++ 日志框架 一.日志框架 一个经过专门设计的实用程序,用于规范应用程序的日志记录过程,就是日志框架. 日志框架可以自己编写(需要一定的能力哦),也可以由第三方(例如:log4cplu ...
- AcWing 106. 动态中位数
依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数. #include<bits/stdc++.h> using namespace std; pri ...
- CentOS-Docker安装MongoDB(单点)
下载镜像 $ docker pull mongo 创建相关目录 $ mkdir -p /usr/mongo/data /usr/mongo/dump 运行镜像 $ docker run --resta ...