📌  相关文章
📜  PyQt5 QSpinBox - 为向下按钮添加边框以实现反按下状态(1)

📅  最后修改于: 2023-12-03 15:18:49.188000             🧑  作者: Mango

PyQt5 QSpinBox - 为向下按钮添加边框以实现反按下状态

在 PyQt5 中, QSpinBox 用于创建一个带有上下箭头按钮的数字选择器。默认情况下,箭头按钮被渲染为纯色,并且不会显示按下状态。

但是,在某些情况下,您可能希望箭头按钮显示按下状态,以便用户可以看到按钮已被按下。通常这可以通过为按钮添加边框来实现,这将使其看起来像按钮凹下。

下面是如何在 PyQt5 中为 QSpinBox 向下按钮添加边框以实现反按下状态的方法:

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPainter, QColor, QPen
from PyQt5.QtWidgets import QSpinBox, QStylePainter, QStyleOptionSpinBox

class BorderedSpinBox(QSpinBox):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def paintEvent(self, event):
        opt = QStyleOptionSpinBox()
        self.initStyleOption(opt)
        painter = QStylePainter(self)
        painter.drawComplexControl(QStyle.CC_SpinBox, opt)
        painter.fillRect(self.rect(), QColor(Qt.white))
        if self.upButton().isDown() or self.upButton().isChecked():
            self.drawButton(painter, self.upButton(), Qt.LeftButton)
        else:
            self.upButton().setIconSize(self.upButton().size() - 2 * self.upButton().iconSize() / 10)
            painter.drawControl(QStyle.CE_SpinBoxUpArrow, opt)

        if self.downButton().isDown() or self.downButton().isChecked():
            self.drawButton(painter, self.downButton(), Qt.RightButton)
        else:
            self.downButton().setIconSize(self.upButton().size() - 2 * self.downButton().iconSize() / 10)
            painter.drawControl(QStyle.CE_SpinBoxDownArrow, opt)

    def drawButton(self, painter, button, buttonType):
        brect = button.rect()
        painter.save()
        painter.translate(brect.center())
        if buttonType == Qt.LeftButton:
            painter.rotate(90)
        painter.translate(-brect.center())
        pen = QPen(QColor(Qt.black))
        pen.setWidth(2)
        brush = QColor(Qt.gray)
        painter.setPen(pen)
        painter.setBrush(brush)
        painter.drawRoundedRect(button.rect(), 5, 5)
        painter.restore()

在这个代码片段中,我们创建了一个名为 BorderedSpinBox 的自定义 QSpinBox 子类,该子类覆盖了 paintEvent() 方法以处理箭头按钮的渲染。渲染过程中的核心是 drawButton() 方法,该方法通过绘制一个具有边框的矩形来渲染箭头按钮。

使用自定义 BorderedSpinBox,我们现在可以在 Pyqt5 应用程序中实现箭头按钮的反按下状态:

from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout
import sys

class AppDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Bordered QSpin Box Demo')
        vbox = QVBoxLayout()
        spinBox = BorderedSpinBox(self)
        vbox.addWidget(spinBox)
        self.setLayout(vbox)
        self.setGeometry(300, 300, 300, 150)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = AppDemo()
    demo.show()
    sys.exit(app.exec_())

在这个示例中,我们创建了一个包含单个 BorderedSpinBox 的 Pyqt5 应用程序窗口。在这个演示中,箭头按钮现在带有外边框,反映了其被按下的状态。这个效果可以成为用户交互和反馈的一个有用的小技巧。