gpt4 book ai didi

python - 临时更改标签样式(模仿按钮)

转载 作者:太空宇宙 更新时间:2023-11-03 21:44:00 25 4
gpt4 key购买 nike

我需要向你们寻求建议,因为我已经没有想法了。我正在研究可点击的标签。我已经完成了一些“可点击标签”类并处理了鼠标悬停事件 - 这会更改标签边框并在鼠标离开时返回到正常状态。

现在我希望它在标签上具有自定义发光效果,但我希望它在单击后 0.5 秒后恢复到正常状态。

我想要带有图像的标签来模仿按钮。 time.sleep 效果不佳,尤其是垃圾邮件点击会卡住应用程序主线程。

希望我没有重新发明轮子,但据我所知,这就是要走的路。

这是示例代码,任何答案都会受到赞赏。

from PySide2.QtWidgets import QLabel, QSizePolicy, QGraphicsDropShadowEffect
from PySide2.QtGui import QPixmap
from PySide2.QtCore import (Signal, QEvent, QObject, QRect)


class ClickableLabel(QLabel):
def __init__(self, pic_path, width, height, border_color, click_function):
super(ClickableLabel, self).__init__()

# Setting the picture path and setting pixmap to label
self.pic_path = pic_path
self.pixmap = QPixmap(self.pic_path)
self.setPixmap(self.pixmap)

# Set the size
self.setFixedSize(width, height)

# Enable tracking and assign function
self.setMouseTracking(True)
self.click_function = click_function

# Set default
if border_color is None:
self.border_color = 'lightblue'
else:
self.border_color = border_color

def mouseMoveEvent(self, event):
# event.pos().x(), event.pos().y()
self.setStyleSheet("border: 1px solid " + str(self.border_color) + ";")

def leaveEvent(self, event):
# event.pos().x(), event.pos().y()
self.setStyleSheet("border: None")

def mousePressEvent(self, event):
self.click_function()

effect = QGraphicsDropShadowEffect(self)
effect.setOffset(0, 0)
effect.setBlurRadius(20)
effect.setColor(self.border_color)
self.setGraphicsEffect(effect)

最佳答案

如果您想在一段时间后运行任务,则不应使用 time.sleep() 因为它会阻止 GUI 导致其无法正常运行,最好的选择是使用 QTimer::singleShot().

另一方面,我看到您正在传递一个函数,以便它在单击时执行任务,这是不可扩展的,在 Qt 中正确的做法是创建一个信号,优点是您可以连接将同一个信号发送给多个函数,无需耦合,即发出信号的函数必须事先不知道谁将接收到该信号。

我建议为参数的缺陷取值,我已经花时间改进了您的代码:

from PySide2 import QtCore, QtGui, QtWidgets


class ClickableLabel(QtWidgets.QLabel):
clicked = QtCore.Signal()

def __init__(self, pic_path="", width=80, height=30, border_color=QtGui.QColor("lightblue"), parent=None):
super(ClickableLabel, self).__init__(parent)
self.setPixmap(QtGui.QPixmap(pic_path))
self.setFixedSize(width, height)
self.setMouseTracking(True)
self.border_color = QtGui.QColor(border_color)
self.effect = QtWidgets.QGraphicsDropShadowEffect(self,
offset=QtCore.QPointF(0, 0),
blurRadius=20,
color=self.border_color)
self.setGraphicsEffect(self.effect)
self.disable_effect()

def mouseMoveEvent(self, event):
self.setStyleSheet("border: 1px solid {};".format(self.border_color.name()))
super(ClickableLabel, self).mouseMoveEvent(event)

def leaveEvent(self, event):
self.setStyleSheet("border: None")
super(ClickableLabel, self).leaveEvent(event)

def mousePressEvent(self, event):
self.clicked.emit()
self.effect.setEnabled(True)
QtCore.QTimer.singleShot(500, self.disable_effect)
super(ClickableLabel, self).mousePressEvent(event)

@QtCore.Slot()
def disable_effect(self):
self.effect.setEnabled(False)


if __name__ == '__main__':
import sys

app = QtWidgets.QApplication(sys.argv)

def on_click():
print("click")

w = ClickableLabel(pic_path="heart.png")
w.clicked.connect(on_click)
w.show()
sys.exit(app.exec_())

关于python - 临时更改标签样式(模仿按钮),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52633209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com