PyQt5 – 创建半透明的按钮

  • Post category:Python

下面是Python中使用PyQt5创建半透明按钮的完整攻略。

安装PyQt5

在终端中输入以下命令即可安装PyQt5:

pip install PyQt5

创建半透明的按钮

我们要创建半透明的按钮,需要继承QPushButton并在重写paintEvent事件中设置按钮半透明效果。下面就给出一个代码示例:

from PyQt5.QtWidgets import QPushButton
from PyQt5.QtGui import QColor, QPainter


class TranslucentButton(QPushButton):
    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.setOpacity(0.5)  # 设置半透明度为0.5
        painter.setPen(self.palette().color(self.backgroundRole()))
        painter.setBrush(QColor(255, 255, 255))
        painter.drawRect(self.rect())
        super().paintEvent(event)

上面的代码中,我们定义了一个名为TranslucentButton的类,继承自QPushButton。在paintEvent事件中,我们使用QPainter来绘制按钮的半透明效果。setOpacity()函数设置了半透明度为0.5,而setBrush()和drawRect()函数则用于绘制按钮的矩形区域。

使用半透明按钮

我们可以直接将TranslucentButton类作为QPushButton的一个子类,来实现我们的半透明按钮,如下所示:

from PyQt5.QtWidgets import QApplication, QMainWindow
from translucent_button import *
import sys


class Example(QMainWindow):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        btn = TranslucentButton('Click', self)
        btn.resize(btn.sizeHint())
        btn.move(50, 50)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Translucent Button')
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

这里我们直接在Example类的initUI()函数中,实例化一个TranslucentButton对象,并设置好窗口的标题等相关信息。控件的大小和位置可以使用resize()和move()函数进行调整。

示例说明

我们可以根据实际的需求来创建不同的半透明按钮效果。下面的两个示例分别演示了不同的半透明按钮效果:

示例1:半透明的圆角矩形按钮

class RoundTranslucentButton(QPushButton):
    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.setOpacity(0.7)  # 设置半透明度为0.7
        painter.setPen(self.palette().color(self.backgroundRole()))
        painter.setBrush(QColor(255, 255, 255))
        painter.drawRoundedRect(self.rect(), 10, 10)
        super().paintEvent(event)

通过重载paintEvent函数,我们在原有的基础上,使用drawRoundedRect函数来绘制圆角矩形。

示例2:半透明的带边框圆形按钮

class CircleTranslucentButton(QPushButton):
    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.setOpacity(0.5)  # 设置半透明度为0.5
        painter.setPen(QColor(255, 255, 255))
        painter.setBrush(QColor(255, 255, 255))
        painter.drawEllipse(self.rect())
        super().paintEvent(event)

        painter.setOpacity(1.0)  # 边界用实线,不透明
        painter.setPen(QColor(0, 0, 0))
        painter.setBrush(QColor(0, 0, 0))
        painter.drawEllipse(self.rect().adjusted(1, 1, -1, -1))
        super().paintEvent(event)

在实现这个效果之前,我们需要先绘制一个透明的圆形。因为我们只能需要边框有颜色和不透明的特点,所以我们需要多写一段代码,来绘制边框:

painter.setOpacity(1.0)
painter.setPen(QColor(0, 0, 0))
painter.setBrush(QColor(0, 0, 0))
painter.drawEllipse(self.rect().adjusted(1, 1, -1, -1)) # 注意,调整rect的边距,使边框能够完整显示
super().paintEvent(event)

这样就可以得到一个半透明的圆形按钮,同时边界是不透明且带有黑色的边框。