前言
写工具界面的时候,发现 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_())