22 QSizePolicy , QPushButton , QFrame , QMessageBox , QFormLayout , QProgressDialog , QTextEdit , QComboBox
33from githubApi import GitHub , Release , SourceManager , PingThread
44from PyQt5 .QtCore import QObject , pyqtSlot , Qt , pyqtSignal , QUrl , QPropertyAnimation , \
5- QRect , QSize , pyqtProperty , QVariantAnimation ,QDateTime
6- from PyQt5 .QtGui import QDesktopServices , QFont , QIcon , QPainter , QPixmap , QPaintEvent
5+ QRect , QSize , pyqtProperty , QVariantAnimation ,QDateTime , QEvent , QEasingCurve
6+ from PyQt5 .QtGui import QDesktopServices , QFont , QIcon , QMouseEvent , QPainter , QPixmap , QPaintEvent , QEnterEvent
77
88
99class AnimationButton (QPushButton ):
@@ -14,6 +14,7 @@ def __init__(self, parent=None):
1414 self .animation = QVariantAnimation (self )
1515 self .animation .valueChanged .connect (self .setRotate )
1616 self .__rotate = 0
17+ self .setFixedSize (20 , 20 )
1718
1819 def rotate (self ):
1920 return self .__rotate
@@ -27,11 +28,13 @@ def paintEvent(self, event):
2728 super ().paintEvent (event )
2829 if self .pixmap is not None :
2930 painter = QPainter (self )
30- painter .setRenderHint (QPainter .RenderHint .Antialiasing )
31- painter .translate (self .width () / 2 , self .height () / 2 )
31+ painter .setRenderHint (QPainter .Antialiasing )
32+ painter .translate (self .width () // 2 , self .height () // 2 )
33+ size = self .width () if self .width () < self .height () else self .height ()
3234 painter .rotate (self .rotate ())
33- painter .drawPixmap (- (self .width ()- 10 ) // 2 , - (self .height ()- 10 ) //
34- 2 , self .pixmap .scaled (self .width () - 10 , self .height () - 10 ))
35+ painter .drawPixmap (- size // 2 , - size //
36+ 2 , self .pixmap .scaled (size ,size ))
37+ self .setMask (self .pixmap .scaled (size ,size ).mask ())
3538
3639 def animationStart (self , check ):
3740 if check :
@@ -51,6 +54,7 @@ def __init__(self, release: Release, mode=">", parent=None, r_path=""):
5154 super ().__init__ (parent )
5255 self .release : Release = release
5356 self .showButton = AnimationButton ()
57+ self .showButton .setToolTip (self .tr ("unfold" ))
5458 self .showButton .setCheckable (True )
5559 self .showButton .pixmap = QPixmap (str (r_path .with_name ('media' ).joinpath ('unfold.png' )).replace ("\\ " , "/" ))
5660 self .dateTimeLabel = QLabel ()
@@ -130,9 +134,9 @@ def initUi(self):
130134 else :
131135 # 样式表红色背景
132136 rgbStr = "rgb(249, 179, 163)"
133- # label字体微软雅黑Ui,大小13
137+ # label字体微软雅黑Ui,大小13,圆角 8
134138 self .setStyleSheet (
135- f"QFrame{{background-color:{ rgbStr } ; font-family:Microsoft YaHei UI; font-size:14px;}}" )
139+ f"QFrame{{background-color:{ rgbStr } ; font-family:Microsoft YaHei UI; font-size:14px; border-radius: 5px; }}" )
136140
137141 def initConnect (self ):
138142 self .showButton .clicked .connect (self .showButtonClicked )
@@ -141,19 +145,24 @@ def initConnect(self):
141145 def showButtonClicked (self , checked : bool ):
142146 self .formWidget .setVisible (True )
143147 animation = QPropertyAnimation (self .formWidget , b"size" , self )
148+ easingCurveType = QEasingCurve .Type .OutBack if checked else QEasingCurve .Type .InBack
149+ animation .setEasingCurve (easingCurveType )
144150 animation2 = QPropertyAnimation (self , b"size" , self )
151+ animation2 .setEasingCurve (easingCurveType )
145152 animation .setDuration (300 )
146153 animation2 .setDuration (300 )
147154 start : QSize = None
148155 end : QSize = None
149156 start1 : QSize = None
150157 end1 : QSize = None
151158 if checked :
159+ self .showButton .setToolTip (QObject .tr (self , "fold" ))
152160 start = QSize (self .width (), 0 )
153161 start1 = QSize (self .width (), self .titleWidget .height ())
154162 end = QSize (self .width (), self .formWidget .sizeHint ().height ())
155163 end1 = QSize (self .width (), self .sizeHint ().height ())
156164 else :
165+ self .showButton .setToolTip (QObject .tr (self , "unfold" ))
157166 start = QSize (self .width (), self .formWidget .sizeHint ().height ())
158167 start1 = QSize (self .width (), self .sizeHint ().height ())
159168 end = QSize (self .width (), 0 )
@@ -174,9 +183,48 @@ def resWidth(self):
174183 area :QScrollArea = self .parentWidget ().parentWidget ().parentWidget ()
175184 width = area .verticalScrollBar ().width () if area .verticalScrollBar ().isVisible () else 0
176185 self .resize (area .width () - width , self .height ())
186+
187+ def mousePressEvent (self , a0 : QMouseEvent ) -> None :
188+ super ().mousePressEvent (a0 )
189+ if self .titleWidget .geometry ().contains (a0 .pos ()) and a0 .button () == Qt .LeftButton :
190+ self .showButton .click ()
191+ def __setStyleSheet (self ,isEnter :bool ):
192+ rgbStr = ""
193+ if self .mode == ">" :
194+ # 样式表绿色
195+ rgbStr = "rgb(200,255,250)"
196+ elif self .mode == "=" :
197+ # 样式表蓝色
198+ rgbStr = "rgb(200,216,230)"
199+ else :
200+ # 样式表红色背景
201+ rgbStr = "rgb(249, 179, 163)"
202+
203+
204+ if isEnter :
205+ # label字体微软雅黑Ui,大小13,圆角 8,1px的蓝色边框,只针对ReleaseFrame
206+ self .setStyleSheet (
207+ f"""QFrame{{background-color:{ rgbStr } ; font-family:Microsoft YaHei UI; font-size:14px; border-radius: 5px;}}
208+ ReleaseFrame{{border: 1px solid blue;}}
209+ """ )
210+ else :
211+ # label字体微软雅黑Ui,大小13,圆角 8
212+ self .setStyleSheet (
213+ f"QFrame{{background-color:{ rgbStr } ; font-family:Microsoft YaHei UI; font-size:14px; border-radius: 5px;}}" )
214+ def enterEvent (self , a0 : QEnterEvent ) -> None :
215+ self .__setStyleSheet (True )
216+ return super ().enterEvent (a0 )
217+
218+ def leaveEvent (self , a0 : QEvent ) -> None :
219+ self .__setStyleSheet (False )
220+ return super ().leaveEvent (a0 )
221+
177222class CheckUpdateGui (QDialog ):
178223 def __init__ (self , github : GitHub , parent = None ):
179224 super ().__init__ (parent .mainWindow )
225+ self .setWindowTitle (QObject .tr (self , "CheckUpdate" ))
226+ # 去掉问号
227+ self .setWindowFlags (self .windowFlags () & ~ Qt .WindowContextHelpButtonHint )
180228 self .r_path = parent .r_path
181229 self .github : GitHub = github
182230 self .github .setParent (self )
@@ -257,6 +305,8 @@ def checkUpdate(self, releases: list[Release]):
257305 widget = QWidget ()
258306 layout = QVBoxLayout ()
259307 layout .setContentsMargins (0 , 0 , 0 , 0 )
308+ # 间隔设置为2px
309+ layout .setSpacing (2 )
260310 for release in releases :
261311 frame = ReleaseFrame (
262312 release , self .github .compareVersion (release .tag_name ), r_path = self .r_path )
@@ -273,6 +323,9 @@ def checkUpdate(self, releases: list[Release]):
273323 self .releaseArea .setWidget (widget )
274324
275325 def showError (self , msg : str ):
326+ widget = self .releaseArea .widget ()
327+ if widget is not None :
328+ widget .deleteLater ()
276329 QMessageBox .critical (self , QObject .tr (self , "Error" ), msg )
277330
278331 def showDownloadDialog (self , release : Release ):
0 commit comments