第二十二篇 -- 事件与信号(自定义label信号的双击功能)

Posted smart-zihan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二十二篇 -- 事件与信号(自定义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的基础上添加了鼠标双击事件处理的功能。

 

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

默认函数名称 触发时机 参数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信号的双击功能)的主要内容,如果未能解决你的问题,请参考以下文章

Django 第二十二篇ModelForm

第十二篇Camunda系列-事件篇-信号事件

第十二篇Camunda系列-事件篇-信号事件

Linux从青铜到王者第十二篇:Linux进程间信号第二篇

Linux从青铜到王者第二十二篇:Linux高级IO

C++从青铜到王者第二十二篇:C++11