【问题标题】:change label style temporary (imitate button)临时更改标签样式(模仿按钮)
【发布时间】:2018-10-03 18:05:55
【问题描述】:

我需要向你们寻求建议,因为我的想法已经不多了。我正在处理可点击的标签。我已经完成了一些“可点击标签”类并处理了 mouseover 事件——它改变了标签边框并在鼠标离开时返回到正常状态。

现在我希望它在标签上具有自定义发光效果,但我希望它在单击后返回正常状态,比如说 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)

【问题讨论】:

    标签: python qlabel pyside2


    【解决方案1】:

    如果您想在一段时间后运行任务,则不应使用 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_())
    

    【讨论】:

    • 非常感谢您抽出宝贵时间@eyllanesc。您对代码的改进完美地解决了这个问题。真的很遗憾,由于我的名声很小,我的 +1 不可见。虽然希望它会成为其他人的完美榜样。感谢您的其他建议 - 我会记住学习 PyQT(学习 tkinter)
    • @Skulldron tkinter 是老派的 GUI,Qt 允许您创建更具可扩展性的项目,因此您了解我建议您阅读的逻辑:doc.qt.io/qt-5/signalsandslots.html
    • 谢谢,这真的很有用:)。
    猜你喜欢
    • 2015-09-30
    • 2013-01-13
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2013-04-17
    相关资源
    最近更新 更多