提交 506f4ef2 编写于 作者: 之一Yo's avatar 之一Yo

对话框添加淡入淡出动画

上级 2bef699a
screenshot/dialog_with_mask.gif

31.2 KB | W: | H:

screenshot/dialog_with_mask.gif

100.4 KB | W: | H:

screenshot/dialog_with_mask.gif
screenshot/dialog_with_mask.gif
screenshot/dialog_with_mask.gif
screenshot/dialog_with_mask.gif
  • 2-up
  • Swipe
  • Onion skin
# coding:utf-8 # coding:utf-8
import textwrap import textwrap
from PyQt5.QtCore import Qt, pyqtSignal from PyQt5.QtCore import Qt, pyqtSignal, QPropertyAnimation, QEasingCurve, QAbstractAnimation
from PyQt5.QtGui import QColor from PyQt5.QtWidgets import (QDialog, QGraphicsDropShadowEffect,
from PyQt5.QtWidgets import QDialog, QGraphicsDropShadowEffect, QLabel, QPushButton, QWidget QGraphicsOpacityEffect, QLabel, QPushButton,
QWidget)
class MaskDialog(QDialog): class MaskDialog(QDialog):
...@@ -24,6 +25,8 @@ class MaskDialog(QDialog): ...@@ -24,6 +25,8 @@ class MaskDialog(QDialog):
def __initWidget(self): def __initWidget(self):
""" 初始化小部件 """ """ 初始化小部件 """
self.__setShadowEffect()
self.widget.setWindowOpacity(0.1)
self.setWindowFlags(Qt.FramelessWindowHint) self.setWindowFlags(Qt.FramelessWindowHint)
self.setAttribute(Qt.WA_TranslucentBackground) self.setAttribute(Qt.WA_TranslucentBackground)
self.setGeometry(0, 0, self.parent().width(), self.parent().height()) self.setGeometry(0, 0, self.parent().width(), self.parent().height())
...@@ -31,7 +34,6 @@ class MaskDialog(QDialog): ...@@ -31,7 +34,6 @@ class MaskDialog(QDialog):
self.widget.setMaximumWidth(675) self.widget.setMaximumWidth(675)
self.titleLabel.move(30, 30) self.titleLabel.move(30, 30)
self.contentLabel.move(30, 70) self.contentLabel.move(30, 70)
self.__setShadowEffect()
self.contentLabel.setText('\n'.join(textwrap.wrap(self.content, 36))) self.contentLabel.setText('\n'.join(textwrap.wrap(self.content, 36)))
# 设置层叠样式 # 设置层叠样式
self.windowMask.setObjectName('windowMask') self.windowMask.setObjectName('windowMask')
...@@ -52,6 +54,33 @@ class MaskDialog(QDialog): ...@@ -52,6 +54,33 @@ class MaskDialog(QDialog):
shadowEffect.setOffset(0, 5) shadowEffect.setOffset(0, 5)
self.widget.setGraphicsEffect(shadowEffect) self.widget.setGraphicsEffect(shadowEffect)
def showEvent(self, e):
""" 淡入 """
opacityEffect = QGraphicsOpacityEffect(self)
self.setGraphicsEffect(opacityEffect)
opacityAni = QPropertyAnimation(opacityEffect, b'opacity', self)
opacityAni.setStartValue(0)
opacityAni.setEndValue(1)
opacityAni.setDuration(200)
opacityAni.setEasingCurve(QEasingCurve.InSine)
opacityAni.finished.connect(opacityEffect.deleteLater)
opacityAni.start()
super().showEvent(e)
def closeEvent(self, e):
""" 淡出 """
self.widget.setGraphicsEffect(None)
opacityEffect = QGraphicsOpacityEffect(self)
self.setGraphicsEffect(opacityEffect)
opacityAni = QPropertyAnimation(opacityEffect, b'opacity', self)
opacityAni.setStartValue(1)
opacityAni.setEndValue(0)
opacityAni.setDuration(100)
opacityAni.setEasingCurve(QEasingCurve.OutCubic)
opacityAni.finished.connect(self.deleteLater)
opacityAni.start()
e.ignore()
def __initLayout(self): def __initLayout(self):
""" 初始化布局 """ """ 初始化布局 """
self.contentLabel.adjustSize() self.contentLabel.adjustSize()
...@@ -67,10 +96,8 @@ class MaskDialog(QDialog): ...@@ -67,10 +96,8 @@ class MaskDialog(QDialog):
def __onCancelButtonClicked(self): def __onCancelButtonClicked(self):
self.cancelSignal.emit() self.cancelSignal.emit()
self.deleteLater() self.close()
def __onYesButtonClicked(self): def __onYesButtonClicked(self):
self.yesSignal.emit() self.yesSignal.emit()
self.deleteLater() self.close()
...@@ -17,6 +17,7 @@ Indicator { ...@@ -17,6 +17,7 @@ Indicator {
width: 50px; width: 50px;
qproperty-sliderOnColor: white; qproperty-sliderOnColor: white;
qproperty-sliderOffColor: black; qproperty-sliderOffColor: black;
qproperty-sliderDisabledColor: rgb(155, 154, 153);
border-radius: 13px; border-radius: 13px;
} }
...@@ -52,8 +53,6 @@ Indicator:checked:pressed { ...@@ -52,8 +53,6 @@ Indicator:checked:pressed {
} }
Indicator:disabled{ Indicator:disabled{
qproperty-sliderOffColor: rgb(155, 154, 153);
qproperty-sliderOnColor: rgb(155, 154, 153);
border: 1px solid rgb(194, 194, 191); border: 1px solid rgb(194, 194, 191);
background-color: rgb(194, 194, 191); background-color: rgb(194, 194, 191);
} }
\ No newline at end of file
...@@ -17,15 +17,16 @@ class Indicator(QToolButton): ...@@ -17,15 +17,16 @@ class Indicator(QToolButton):
self.resize(50, 26) self.resize(50, 26)
self.__sliderOnColor = QColor(Qt.white) self.__sliderOnColor = QColor(Qt.white)
self.__sliderOffColor = QColor(Qt.black) self.__sliderOffColor = QColor(Qt.black)
self.__sliderDisabledColor = QColor(QColor(155, 154, 153))
self.timer = QTimer(self) self.timer = QTimer(self)
self.padding = self.height()//4 self.padding = self.height()//4
self.sliderX = self.padding self.sliderX = self.padding
self.sliderRadius = (self.height()-2*self.padding)//2 self.sliderRadius = (self.height()-2*self.padding)//2
self.sliderEndX = self.width()-2*self.sliderRadius self.sliderEndX = self.width()-2*self.sliderRadius
self.sliderStep = self.width()/50 self.sliderStep = self.width()/50
self.timer.timeout.connect(self.updateSliderPos) self.timer.timeout.connect(self.__updateSliderPos)
def updateSliderPos(self): def __updateSliderPos(self):
""" 更新滑块位置 """ """ 更新滑块位置 """
if self.isChecked(): if self.isChecked():
if self.sliderX+self.sliderStep < self.sliderEndX: if self.sliderX+self.sliderStep < self.sliderEndX:
...@@ -48,7 +49,7 @@ class Indicator(QToolButton): ...@@ -48,7 +49,7 @@ class Indicator(QToolButton):
return return
super().setChecked(isChecked) super().setChecked(isChecked)
self.sliderEndX = self.width()-2*self.sliderRadius - \ self.sliderEndX = self.width()-2*self.sliderRadius - \
self.padding if self.isChecked() else self.padding self.padding if self.isChecked() else self.padding
self.timer.start(5) self.timer.start(5)
def mouseReleaseEvent(self, e): def mouseReleaseEvent(self, e):
...@@ -73,7 +74,10 @@ class Indicator(QToolButton): ...@@ -73,7 +74,10 @@ class Indicator(QToolButton):
painter = QPainter(self) painter = QPainter(self)
painter.setRenderHints(QPainter.Antialiasing) painter.setRenderHints(QPainter.Antialiasing)
painter.setPen(Qt.NoPen) painter.setPen(Qt.NoPen)
color = self.__sliderOnColor if self.isChecked() else self.__sliderOffColor if self.isEnabled():
color = self.sliderOnColor if self.isChecked() else self.sliderOffColor
else:
color = self.sliderDisabledColor
painter.setBrush(color) painter.setBrush(color)
painter.drawEllipse(self.sliderX, self.padding, painter.drawEllipse(self.sliderX, self.padding,
self.sliderRadius*2, self.sliderRadius*2) self.sliderRadius*2, self.sliderRadius*2)
...@@ -92,8 +96,17 @@ class Indicator(QToolButton): ...@@ -92,8 +96,17 @@ class Indicator(QToolButton):
self.__sliderOffColor = color self.__sliderOffColor = color
self.update() self.update()
def getSliderDisabledColor(self):
return self.__sliderDisabledColor
def setSliderDisabledColor(self, color: QColor):
self.__sliderDisabledColor = color
self.update()
sliderOnColor = pyqtProperty(QColor, getSliderOnColor, setSliderOnColor) sliderOnColor = pyqtProperty(QColor, getSliderOnColor, setSliderOnColor)
sliderOffColor = pyqtProperty(QColor, getSliderOffColor, setSliderOffColor) sliderOffColor = pyqtProperty(QColor, getSliderOffColor, setSliderOffColor)
sliderDisabledColor = pyqtProperty(
QColor, getSliderDisabledColor, setSliderDisabledColor)
class SwitchButton(QWidget): class SwitchButton(QWidget):
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册