From f037fa4fc339cace3430d43ab5ddf2e606ca3118 Mon Sep 17 00:00:00 2001 From: FrankCV2048 <1395405735@qq.com> Date: Wed, 16 Oct 2024 23:18:25 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E6=8B=9F=E5=A2=9E=E5=8A=A0=E7=82=B9?= =?UTF-8?q?=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Image/login.svg | 1 + Image/logout.svg | 1 + Image/title_ico.png | Bin 0 -> 4345 bytes TEST3.py | 90 +++++++++++++++++++++++++++++++ test.py | 127 +++++++++++++++++++++++++++++--------------- test2.py | 76 ++++++++++++++++++++++++++ test5.py | 40 ++++++++++++++ untitled.ui | 25 +++++++++ 8 files changed, 318 insertions(+), 42 deletions(-) create mode 100644 Image/login.svg create mode 100644 Image/logout.svg create mode 100644 Image/title_ico.png create mode 100644 TEST3.py create mode 100644 test2.py create mode 100644 test5.py diff --git a/Image/login.svg b/Image/login.svg new file mode 100644 index 0000000..ccae57b --- /dev/null +++ b/Image/login.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Image/logout.svg b/Image/logout.svg new file mode 100644 index 0000000..1346842 --- /dev/null +++ b/Image/logout.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Image/title_ico.png b/Image/title_ico.png new file mode 100644 index 0000000000000000000000000000000000000000..4d1031ccc50c077787b7decb2a777a24984262ab GIT binary patch literal 4345 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 0: + painter = QPainter(self) + painter.setRenderHint(QPainter.Antialiasing) + color = QColor(255, 255, 255) + color.setAlphaF(self._ripple_opacity) + painter.setBrush(QBrush(color)) + painter.setPen(Qt.NoPen) + painter.drawEllipse(self.ripple_position, self._ripple_radius, self._ripple_radius) + + def mousePressEvent(self, event): + if event.button() == Qt.LeftButton: + self.ripple_position = event.pos() + self.startRippleEffect() + super().mousePressEvent(event) + + def startRippleEffect(self): + # 取消之前的动画 + self.animation_group.stop() + self.animation_group.clear() + + # 创建半径动画 + radius_animation = QPropertyAnimation(self, b"rippleRadius") + radius_animation.setDuration(600) + radius_animation.setStartValue(0) + # 计算最大半径,确保覆盖按钮 + max_radius = max(self.width(), self.height()) * 1.5 + radius_animation.setEndValue(max_radius) + radius_animation.setEasingCurve(QEasingCurve.OutQuad) + + # 创建透明度动画 + opacity_animation = QPropertyAnimation(self, b"rippleOpacity") + opacity_animation.setDuration(600) + opacity_animation.setStartValue(0.5) # 初始透明度可以调整 + opacity_animation.setEndValue(0.0) + opacity_animation.setEasingCurve(QEasingCurve.OutQuad) + + # 将动画添加到动画组 + self.animation_group.addAnimation(radius_animation) + self.animation_group.addAnimation(opacity_animation) + self.animation_group.start() + + # 使用 @Property 装饰器正确定义属性 + def getRippleRadius(self): + return self._ripple_radius + + def setRippleRadius(self, radius): + self._ripple_radius = radius + self.update() + + rippleRadius = Property(float, getRippleRadius, setRippleRadius) + + def getRippleOpacity(self): + return self._ripple_opacity + + def setRippleOpacity(self, opacity): + self._ripple_opacity = opacity + self.update() + + rippleOpacity = Property(float, getRippleOpacity, setRippleOpacity) + +class MainWindow(QMainWindow): def __init__(self): super().__init__() + self.setWindowTitle("水滴扩散按钮示例") + self.setFixedSize(400, 300) - self.init_ui() - - def init_ui(self): - # 创建一个垂直布局 - layout = QVBoxLayout() - - # 创建一个标签来显示滑块的值 - self.label = QLabel("当前值: 0", self) - layout.addWidget(self.label) - - # 创建一个滑块 - self.slider = QSlider(Qt.Horizontal, self) - self.slider.setMinimum(0) - self.slider.setMaximum(100) - self.slider.setValue(0) # 初始值设为0 - self.slider.setTickPosition(QSlider.TicksBelow) - self.slider.setTickInterval(10) - layout.addWidget(self.slider) - - # 创建一个按钮来获取滑块的当前值 - self.button = QPushButton("获取滑块值", self) - self.button.clicked.connect(self.show_slider_value) - layout.addWidget(self.button) - - # 设置窗口布局 - self.setLayout(layout) - - self.setWindowTitle('QSlider 示例') - - def show_slider_value(self): - # 直接获取滑块的当前值并更新标签 - value = self.slider.value() - print(f"滑块的值是: {value}") # 添加打印以调试 - self.label.setText(f"当前值: {value}") + self.button = RippleButton("点击我", self) + self.button.setGeometry(150, 130, 100, 40) if __name__ == "__main__": - app = QApplication([]) - - window = SliderExample() + app = QApplication(sys.argv) + window = MainWindow() window.show() - - app.exec() + sys.exit(app.exec()) diff --git a/test2.py b/test2.py new file mode 100644 index 0000000..01ec96e --- /dev/null +++ b/test2.py @@ -0,0 +1,76 @@ +from PySide6.QtWidgets import QApplication, QPushButton, QMainWindow +from PySide6.QtGui import QPainter, QLinearGradient, QColor, QFont +from PySide6.QtCore import Qt, QRectF +import sys + +class GradientButton(QPushButton): + def __init__(self, text, parent=None): + super().__init__(text, parent) + # 设置按钮无边框 + self.setFlat(True) + # 设置按钮文本对齐方式 + + # 设置按钮字体 + self.setFont(QFont("Arial", 14, QFont.Bold)) + # 启用鼠标追踪以便在悬停时重绘 + self.setMouseTracking(True) + # 当前是否悬停 + self.hover = False + + def paintEvent(self, event): + painter = QPainter(self) + painter.setRenderHint(QPainter.Antialiasing) + + # 获取按钮的矩形区域 + rect = self.rect() + + # 创建线性渐变,从中心线向上下渐变 + gradient = QLinearGradient(rect.center().x(), rect.top(), rect.center().x(), rect.bottom()) + + + gradient.setColorAt(0, QColor(225,225,225)) + gradient.setColorAt(0.5, QColor('#1A1F38')) + gradient.setColorAt(1, QColor(225,225,225)) + + brush = gradient + painter.setBrush(brush) + painter.setPen(Qt.NoPen) + + # 绘制圆角矩形作为按钮背景 + radius = 2 # 圆角半径 + painter.drawRoundedRect(QRectF(rect), radius, radius) + + # 绘制按钮文本 + painter.setPen(QColor('#E8E9EB')) # 设置字体为白色 + painter.drawText(rect, Qt.AlignCenter, self.text()) + + def enterEvent(self, event): + self.hover = True + self.update() # 触发重绘 + super().enterEvent(event) + + def leaveEvent(self, event): + self.hover = False + self.update() # 触发重绘 + super().leaveEvent(event) + +class MainWindow(QMainWindow): + def __init__(self): + super().__init__() + self.setWindowTitle("中心线性渐变按钮示例") + self.setFixedSize(400, 300) + + # 创建自定义渐变按钮 + self.button = GradientButton("点击我", self) + self.button.setGeometry(100, 130, 100, 40) + # 连接按钮点击事件 + self.button.clicked.connect(self.on_button_click) + + def on_button_click(self): + print("按钮被点击了!") + +if __name__ == "__main__": + app = QApplication(sys.argv) + window = MainWindow() + window.show() + sys.exit(app.exec()) diff --git a/test5.py b/test5.py new file mode 100644 index 0000000..49baf23 --- /dev/null +++ b/test5.py @@ -0,0 +1,40 @@ +from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton +import sys + +app = QApplication(sys.argv) + +window = QWidget() +layout = QVBoxLayout() + +# 创建按钮 +button = QPushButton("Button") + +# 使用 QSS 设置按钮样式 +window.setStyleSheet(""" + QPushButton { + background-color: #4CAF50; /* 按钮背景色 */ + color: white; /* 按钮文本颜色 */ + padding: 10px; /* 按钮内边距 */ + border: none; /* 移除所有默认边框 */ + border-right: 20px solid white; /* 仅设置右边的边框 */ + background-color: qlineargradient(x1: 0.5, y1: 0, x2: 0.5, y2: 1, stop: 0 #4CAF50, stop: 0.5 rgba(0, 235, 0, 0), stop: 1 #4CAF50); + border-width: 2px; /* 边框宽度 */ + border-radius: 5px; /* 按钮圆角 */ + } + QPushButton:hover { + background-color: #45a049; /* 悬停时背景色 */ + } +""") + +## + +# border-color:qradialgradient(cx: 0.5, cy: 0.5 +# , radius: 0.8, fx:0.5 ,fy:0.5, +# stop: 0 rgba(255, 255, 255, 255), +# stop: 1 rgba(19, 36, 69, 255)); + +layout.addWidget(button) +window.setLayout(layout) +window.show() + +sys.exit(app.exec()) diff --git a/untitled.ui b/untitled.ui index 84cdc63..2276c30 100644 --- a/untitled.ui +++ b/untitled.ui @@ -1020,6 +1020,31 @@ background-color:#1cb052; + + + + 84 + 120 + 101 + 51 + + + + * { + background: qradialgradient(cx: 0.5, cy: 0.1 +, radius: 0.8, fx:0.5 ,fy:0, + stop: 0 rgba(255,255,255, 255), + stop: 1 rgba(33, 150, 243, 255)); +font: 9pt "楷体"; +border: 1px solid #dcdfe6; +border-radius: 10px; +} + + + + PushButton + +