временно изменить стиль метки (кнопка имитации) - PullRequest
0 голосов
/ 03 октября 2018

Мне нужно попросить вас, ребята, за советом, так как у меня заканчиваются идеи.Я работаю на кликабельном ярлыке.Я уже сделал некоторый класс "clickable label" и обработал событие 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)

1 Ответ

0 голосов
/ 03 октября 2018

Если вы хотите запустить задачу через некоторое время, вы не должны использовать time.sleep(), поскольку, поскольку она блокирует графический интерфейс, вызывая ее неправильное поведение, лучше всего использовать 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_())
...