如何动画 qpushbutton 背景的渐变在悬停时从左到右移动?
How to animate a qpushbutton background's gradient to go from left to right on hover?
我正在练习我的编程技能,我正在尝试使用 PyQt
构建一个登录系统应用程序。我是在 Login V4 之后设计的。现在,当您将鼠标悬停在登录按钮上时,我正在尝试从登录按钮上实现酷炫的渐变动画。但是 CSS
动画代码在 qt stylesheet
中不起作用。我使用 Qt Designer 设计了该应用程序。甚至可以在 pyqt
中创建该动画吗?如果是,你是怎么做到的?
我的应用程序如下所示:
登录按钮的样式表代码:
QPushButton#login_button {
font: 75 10pt "Microsoft YaHei UI";
font-weight: bold;
color: rgb(255, 255, 255);
background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgb(61, 217, 245), stop:1 rgb(240, 53, 218));
border-style: solid;
border-radius:21px;
}
如您所料,Qt Style Sheet 不支持动画。在这种情况下,另一种方法是使用 QXAnimation 作为 QVariantAnimation:
from PyQt5 import QtCore, QtGui, QtWidgets
class LoginButton(QtWidgets.QPushButton):
def __init__(self, parent=None):
super().__init__(parent)
self.setMinimumSize(60, 60)
self.color1 = QtGui.QColor(240, 53, 218)
self.color2 = QtGui.QColor(61, 217, 245)
self._animation = QtCore.QVariantAnimation(
self,
valueChanged=self._animate,
startValue=0.00001,
endValue=0.9999,
duration=250
)
def _animate(self, value):
qss = """
font: 75 10pt "Microsoft YaHei UI";
font-weight: bold;
color: rgb(255, 255, 255);
border-style: solid;
border-radius:21px;
"""
grad = "background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 {color1}, stop:{value} {color2}, stop: 1.0 {color1});".format(
color1=self.color1.name(), color2=self.color2.name(), value=value
)
qss += grad
self.setStyleSheet(qss)
def enterEvent(self, event):
self._animation.setDirection(QtCore.QAbstractAnimation.Forward)
self._animation.start()
super().enterEvent(event)
def leaveEvent(self, event):
self._animation.setDirection(QtCore.QAbstractAnimation.Backward)
self._animation.start()
super().enterEvent(event)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = QtWidgets.QWidget()
lay = QtWidgets.QVBoxLayout(w)
for i in range(5):
button = LoginButton()
button.setText("Login")
lay.addWidget(button)
lay.addStretch()
w.resize(640, 480)
w.show()
sys.exit(app.exec_())
我正在练习我的编程技能,我正在尝试使用 PyQt
构建一个登录系统应用程序。我是在 Login V4 之后设计的。现在,当您将鼠标悬停在登录按钮上时,我正在尝试从登录按钮上实现酷炫的渐变动画。但是 CSS
动画代码在 qt stylesheet
中不起作用。我使用 Qt Designer 设计了该应用程序。甚至可以在 pyqt
中创建该动画吗?如果是,你是怎么做到的?
我的应用程序如下所示:
登录按钮的样式表代码:
QPushButton#login_button {
font: 75 10pt "Microsoft YaHei UI";
font-weight: bold;
color: rgb(255, 255, 255);
background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgb(61, 217, 245), stop:1 rgb(240, 53, 218));
border-style: solid;
border-radius:21px;
}
如您所料,Qt Style Sheet 不支持动画。在这种情况下,另一种方法是使用 QXAnimation 作为 QVariantAnimation:
from PyQt5 import QtCore, QtGui, QtWidgets
class LoginButton(QtWidgets.QPushButton):
def __init__(self, parent=None):
super().__init__(parent)
self.setMinimumSize(60, 60)
self.color1 = QtGui.QColor(240, 53, 218)
self.color2 = QtGui.QColor(61, 217, 245)
self._animation = QtCore.QVariantAnimation(
self,
valueChanged=self._animate,
startValue=0.00001,
endValue=0.9999,
duration=250
)
def _animate(self, value):
qss = """
font: 75 10pt "Microsoft YaHei UI";
font-weight: bold;
color: rgb(255, 255, 255);
border-style: solid;
border-radius:21px;
"""
grad = "background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 {color1}, stop:{value} {color2}, stop: 1.0 {color1});".format(
color1=self.color1.name(), color2=self.color2.name(), value=value
)
qss += grad
self.setStyleSheet(qss)
def enterEvent(self, event):
self._animation.setDirection(QtCore.QAbstractAnimation.Forward)
self._animation.start()
super().enterEvent(event)
def leaveEvent(self, event):
self._animation.setDirection(QtCore.QAbstractAnimation.Backward)
self._animation.start()
super().enterEvent(event)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = QtWidgets.QWidget()
lay = QtWidgets.QVBoxLayout(w)
for i in range(5):
button = LoginButton()
button.setText("Login")
lay.addWidget(button)
lay.addStretch()
w.resize(640, 480)
w.show()
sys.exit(app.exec_())