前言

写工具界面的时候,发现 QPushButton 按钮不能被图标完全覆盖,而选择使用 QToolButton 按钮,但是 QToolButton 按钮本身是没有双击事件的,我在写工具的时候又对这个双击事件很执着,就自己实现一下,并为该结果做记录。

实现逻辑

要实现 QToolButton 按钮的双击事件:需要新建一个继承于 QToolButton 的子类,该类继承 QToolButton 的 click 鼠标单击事件,添加 singleClicked 和 doubleClicked 两个信号用于发送我们想要的单/双击信号,并在子类中添加一个 Qtimer 作为判断依据:将 QTimer 设置为单次触发, 并为QTimer 设定一个较短的时间,在该时间内,click信号链接到事件判断函数,如果再次点击该按钮则判断为双击事件,同时将 QTimer 停止;反之 QTimer 超时,QTimer 发送超时信号到单击事件函数,也需要将Qtimer 停止。当实例化这个子类后,点击按钮,该 click 信号即在实例内部进行判断。

代码示例

# !/user/bin/python37
# -*- coding: utf-8 -*-
# Author:Mirror
# Time: 2022/03/26
# ================================
import sys
from PySide2.QtWidgets import QApplication, QToolButton
from PySide2.QtCore import Qt, Signal, QTimer

class DccButton(QToolButton):
    """定义ToolButton按钮双击事件"""
    doubleClicked = Signal()  # 双击信号
    singleClicked = Signal()  # 单击信号
    def __init__(self):
        super(DccButton, self).__init__()
        self.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)  # 设置图标在字体之上
        self.timer = QTimer()  # 创建触发器
        self.timer.setSingleShot(True) # 仅单次触发
        self.timer.setInterval(200) # 触发间隔,用于判断是否为双击
        self.timer.timeout.connect(self.singleClick) # 超时信号连接至单击
        self.clicked.connect(self.checkDoubleClick) # 连接至成员函数判断是否为双击

    def singleClick(self):
        """
            发送单击信号
        """
        self.timer.stop()
        self.setDown(False)
        self.singleClicked.emit()
        print("单击")

    def checkDoubleClick(self):
        """
            判断是否为双击信号,否则信号超时
        """
        if not self.isDown():
            self.setDown(True)
        if self.timer.isActive():
            self.timer.stop()
            self.setDown(False)
            self.doubleClicked.emit()
            print("双击")
            return
        else:
            self.timer.start()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = DccButton()
    form.show()
    sys.exit(app.exec_())