zoukankan      html  css  js  c++  java
  • 第二十二篇 -- 事件与信号(自定义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

    可以在自己的自定义类中使用这些事件。

  • 相关阅读:
    poj 2187 Beauty Contest(旋转卡壳)
    poj 2540 Hotter Colder(极角计算半平面交)
    poj 1279 Art Gallery(利用极角计算半平面交)
    poj 3384 Feng Shui(半平面交的联机算法)
    poj 1151 Atlantis(矩形面积并)
    zoj 1659 Mobile Phone Coverage(矩形面积并)
    uva 10213 How Many Pieces of Land (欧拉公式计算多面体)
    uva 190 Circle Through Three Points(三点求外心)
    zoj 1280 Intersecting Lines(两直线交点)
    poj 1041 John's trip(欧拉回路)
  • 原文地址:https://www.cnblogs.com/smart-zihan/p/12826422.html
Copyright © 2011-2022 走看看