Python版圆盘式按钮

如图,绘制这样的按钮!

废话不多说,上代码!

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtCore import Qt, QRectF, QPoint, Signal
from PySide6.QtGui import QPainter, QPainterPath, QColor, QFont

class CircleButton(QWidget):
    buttonClicked = Signal(int)

    def __init__(self):
        super().__init__()
        self.setGeometry(0, 0, 400, 400)
        self.radius = 50
        self.center_radius = 20
        self.arc_paths = []
        self.text_paths = []
        self.colors = [QColor(74, 74, 74), QColor(74, 74, 74), QColor(74, 74, 74), QColor(74, 74, 74)]
        self.center_color = QColor(150, 150, 150)
        self.pressed_index = -1
        self.initPaths()
        self.show()

    def initPaths(self):
        rect = QRectF(-self.radius, -self.radius, self.radius * 2, self.radius * 2)
        angles = [50, 140, 230, 320] #主要是这里理解一下来更改按钮的大小,理解一下arcTo(在下面几行)就能知道怎么调整了!
        span = 80

        for angle in angles:
            path = QPainterPath()
            path.moveTo(0, 0)
            path.arcTo(rect, angle, span)
            path.closeSubpath()
            inner_circle = QPainterPath()
            inner_circle.addEllipse(QPoint(0, 0), self.center_radius, self.center_radius)
            path -= inner_circle
            self.arc_paths.append(path)

        center_path = QPainterPath()
        center_path.addEllipse(QPoint(0, 0), self.center_radius-10, self.center_radius-10)
        self.arc_paths.append(center_path)

        # Define patterns for each button
        patterns = [
            QPainterPath(),  # Up arrow
            QPainterPath(),  # Left arrow
            QPainterPath(),  # Down arrow
            QPainterPath(),  # Right arrow
            QPainterPath()   # Center circle
        ]
        
        # Create up arrow pattern (centered)
        patterns[0].moveTo(-8, -5)
        patterns[0].lineTo(0, -15)
        patterns[0].lineTo(8, -5)
        patterns[0].closeSubpath()
        
        # Create left arrow pattern (centered)
        patterns[1].moveTo(-5, -8)
        patterns[1].lineTo(-15, 0)
        patterns[1].lineTo(-5, 8)
        patterns[1].closeSubpath()
        
        # Create down arrow pattern (centered)
        patterns[2].moveTo(-8, 5)
        patterns[2].lineTo(0, 15)
        patterns[2].lineTo(8, 5)
        patterns[2].closeSubpath()
        
        # Create right arrow pattern (centered)
        patterns[3].moveTo(5, -8)
        patterns[3].lineTo(15, 0)
        patterns[3].lineTo(5, 8)
        patterns[3].closeSubpath()
        
        # Create center circle pattern
        patterns[4].addEllipse(QPoint(0, 0), 8, 8)
        
        # Position offsets for each pattern (centered within their respective sections)
        positions = [
            QPoint(0, -self.radius/2),  # Up
            QPoint(-self.radius/2, 0),  # Left
            QPoint(0, self.radius/2),   # Down
            QPoint(self.radius/2, 0),   # Right
            QPoint(0, 0)                # Center
        ]
        
        # Add patterns to text_paths
        for path, pos in zip(patterns, positions):
            pattern_path = QPainterPath()
            pattern_path.addPath(path)
            pattern_path.translate(pos)
            self.text_paths.append(pattern_path)

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.translate(self.width() / 2, self.height() / 2)

        for i, path in enumerate(self.arc_paths):
            color = self.colors[i] if i < 4 else self.center_color
            painter.setBrush(color)
            painter.setPen(Qt.NoPen)
            painter.drawPath(path)

            if i == self.pressed_index:
                painter.setBrush(QColor(255, 255, 255, 100))
                painter.drawPath(path)

            painter.setBrush(Qt.black)
            painter.drawPath(self.text_paths[i])

    def mousePressEvent(self, event):
        pos = event.position() - QPoint(self.width() / 2, self.height() / 2)
        for i, path in enumerate(self.arc_paths):
            if path.contains(pos):
                self.pressed_index = i
                self.buttonClicked.emit(i)
                self.update()
                break

    def mouseReleaseEvent(self, event):
        self.pressed_index = -1
        self.update()

if __name__ == '__main__':
    app = QApplication([])
    widget = CircleButton()
    widget.buttonClicked.connect(lambda idx: print(f"Button {idx} clicked"))
    app.exec()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值