第二十二篇 -- 事件与信号(自定义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/ 本文出自方志朋的博客 这篇文 ...
随机推荐
- 九、配置Tomcat集群
配置Tomcat集群所需服务器三台:192.168.1.5(调度服务器).192.168.1.10(WEB1),192.168.1.20(WEB2) 1.调度服务器设置 [root@proxy ~]# ...
- 【SQLite】教程05-SQLite创建数据库、附加、分离数据库
创建数据库 .quit命令 退出sqlite 提示符 .quit .dump 命令 使用 SQLite .dump 点命令来导出完整的数据库在一个文本文件中,如下所示: sqlite3 Test.db ...
- Shiro安全框架「快速入门」就这一篇
Shiro 简介 照例又去官网扒了扒介绍: Apache Shiro is a powerful and easy-to-use Java security framework that perfor ...
- 我的新书《C++服务器开发精髓》终于出版啦
一.千呼万唤始出来 亲爱的各位读者,我的新书<C++ 服务器开发精髓>终于终于终于与大家见面了,图书如下: 图书的封面设计很精美,当然内容一定不负众望.因出版社老师要求提供一张照片放到封面 ...
- Java-Java8特性(更新中)
Java8新特性 之前零零散散写了很多java8的内容,今天做一个整理,也算是整理用到的内容,当然细化的话还有很多,只是说暂时用不到,为了面试的话已经够了 日期计算 Lambda表达式 函数式接口(比 ...
- python随机漫步
- 通过xrdp连接centos7桌面:
6.1.需求场景: 1.希望使用windows远程访问centos图形界面,使用xmanager连接centos远程桌面时有以下问题: (1)只能有一个用户同时使用xmanger连接远程桌面,多个用户 ...
- 27、路由 route
优先于网卡中的配置,但是重启或重启网卡失效,最好加入到开机自启动服务中/etc/rc.local文件中: 27.1.添加网络路由: 目的网络.目的网络掩码,网关.网卡: 网络寻址以路由表中的路由优先: ...
- 20、高可用数据同步工具drbd介绍
20.1.什么是drbd: 20.2.drbd的工作原理: 20.3.drbd的同步模式: 1.实时同步模式: 2.异步同步模式: 20.4.drbd生产应用场景: 1.生产场景中drbd常用于基于高 ...
- JS 获取JSON数据的属性
var tballdata= [{ 'tjqd': '', 'A1': '', 'A2': '', 'A3': '', 'A4': '' };] if (typeof tballdata[0] == ...