PyQt5 QSpinBox – 为上升按钮添加边框

  • Post category:Python
  1. PyQt5 QSpinBox简介

在PyQt5中,QSpinBox是一个具有单个整数值的微调框组件。通过按下“上”或“下”按钮,用户可以增加或减少值。

  1. 如何为上升按钮添加边框

为QSpinBox上升按钮添加边框,可以使用QProxyStyle类来创建一个自定义的样式。具体步骤如下:

  • 导入必要的类:
from PyQt5.QtWidgets import QSpinBox, QStylePainter
from PyQt5.QtGui import QPalette, QColor, QPen
from PyQt5.QtCore import QRect
from PyQt5.Qt import QProxyStyle, QStyleOptionSpinBox
  • 定义一个自定义的样式:
class MyProxyStyle(QProxyStyle):
    def drawComplexControl(self, control, option, painter, widget=None):
        if control == QStyle.CC_SpinBox:
            rect = option.rect
            if option.state & QStyle.State_Enabled:
                palette = option.palette
                if option.state & QStyle.State_MouseOver:
                    color = palette.color(QPalette.Button)
                    if option.state & QStyle.State_Sunken:
                        color = color.darker(110)
                    else:
                        color = color.lighter(110)
                    painter.setBrush(QColor(color))
                else:
                    painter.setBrush(palette.color(QPalette.Button))
                painter.setPen(QPen(palette.color(QPalette.ButtonText)))
                painter.drawRoundedRect(rect, 2, 2)
                rect.adjust(4, 4, -4, -4)
                super().drawComplexControl(control, QStyleOptionSpinBox(option), painter, widget)
  • 创建一个QSpinBox并在其上设置自定义的样式:
spinbox = QSpinBox()
spinbox.setStyle(MyProxyStyle())
  1. 示例说明

以下是两个示例,演示了如何为不同类型的QSpinBox添加边框。

1)为普通的QSpinBox添加边框:

from PyQt5.QtWidgets import QApplication, QSpinBox, QVBoxLayout, QWidget
from PyQt5.QtGui import QPalette, QColor, QPen
from PyQt5.QtCore import QRect
from PyQt5.Qt import QProxyStyle, QStyleOptionSpinBox

class MyProxyStyle(QProxyStyle):
    def drawComplexControl(self, control, option, painter, widget=None):
        if control == QStyle.CC_SpinBox:
            rect = option.rect
            if option.state & QStyle.State_Enabled:
                palette = option.palette
                if option.state & QStyle.State_MouseOver:
                    color = palette.color(QPalette.Button)
                    if option.state & QStyle.State_Sunken:
                        color = color.darker(110)
                    else:
                        color = color.lighter(110)
                    painter.setBrush(QColor(color))
                else:
                    painter.setBrush(palette.color(QPalette.Button))
                painter.setPen(QPen(palette.color(QPalette.ButtonText)))
                painter.drawRoundedRect(rect, 2, 2)
                rect.adjust(4, 4, -4, -4)
                super().drawComplexControl(control, QStyleOptionSpinBox(option), painter, widget)

app = QApplication([])
widget = QWidget()
layout = QVBoxLayout(widget)

spinbox = QSpinBox()
spinbox.setStyle(MyProxyStyle())
layout.addWidget(spinbox)

widget.show()
app.exec_()

2)为QSpinBox的派生类QDoubleSpinBox添加边框:

from PyQt5.QtWidgets import QApplication, QDoubleSpinBox, QVBoxLayout, QWidget
from PyQt5.QtGui import QPalette, QColor, QPen
from PyQt5.QtCore import QRect
from PyQt5.Qt import QProxyStyle, QStyleOptionSpinBox

class MyDoubleSpinBox(QDoubleSpinBox):
    def __init__(self):
        super().__init__()
        self.setStyle(MyProxyStyle())

class MyProxyStyle(QProxyStyle):
    def drawComplexControl(self, control, option, painter, widget=None):
        if control == QStyle.CC_SpinBox:
            rect = option.rect
            if option.state & QStyle.State_Enabled:
                palette = option.palette
                if option.state & QStyle.State_MouseOver:
                    color = palette.color(QPalette.Button)
                    if option.state & QStyle.State_Sunken:
                        color = color.darker(110)
                    else:
                        color = color.lighter(110)
                    painter.setBrush(QColor(color))
                else:
                    painter.setBrush(palette.color(QPalette.Button))
                painter.setPen(QPen(palette.color(QPalette.ButtonText)))
                painter.drawRoundedRect(rect, 2, 2)
                rect.adjust(4, 4, -4, -4)
                super().drawComplexControl(control, QStyleOptionSpinBox(option), painter, widget)

app = QApplication([])
widget = QWidget()
layout = QVBoxLayout(widget)

spinbox = MyDoubleSpinBox()
layout.addWidget(spinbox)

widget.show()
app.exec_()