PyQt5 – 复选框右侧有指示器

  • Post category:Python

下面是关于PyQt5中复选框右侧有指示器的使用攻略。

简介

在PyQt5中,复选框右侧有指示器是指复选框右侧的一个小方块来表示复选框是否被选中,在某些情况下,它比原始的复选框更容易识别和操作。

基本使用

使用QCheckBox类来创建一个复选框:

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

app = QApplication([])
window = QWidget()

layout = QVBoxLayout()

checkbox = QCheckBox('Check me!')
layout.addWidget(checkbox)

window.setLayout(layout)
window.show()
app.exec_()

以上代码会生成一个带有一个简单复选框的窗口,但它的右边并没有指示器。要在复选框右侧添加指示器,必须设置样式表。

checkbox.setStyleSheet("QCheckBox::indicator {width: 20px; height: 20px;}")

这会给复选框添加一个宽度和高度为20像素的指示器。请注意,这仅适用于当前复选框。如果您想在应用程序中的所有复选框中使用此指示器,则需要将该样式表添加到更高级别的父类QApplication或QWidget。

自定义指示器

如果您需要自定义复选框的指示器,例如将其更改为图像或更改其形状和颜色,则可以使用QProxyStyle类。

from PyQt5.QtWidgets import QApplication, QMainWindow, QCheckBox
from PyQt5.QtGui import QPainter, QPixmap, QPalette, QColor, QBrush
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QProxyStyle

class MyCustomStyle(QProxyStyle):
    def drawComplexControl(self, control, option, painter, widget=None):
        if control == QStyle.CC_CheckBox:
            checkboxRect = self.subControlRect(QStyle.CC_CheckBox, option, QStyle.SC_CheckBoxIndicator, widget)
            pixmap = QPixmap('your_image.png')
            painter.drawPixmap(checkboxRect, pixmap)

app = QApplication([])
window = QMainWindow()

checkbox = QCheckBox()
window.setCentralWidget(checkbox)

palette = QPalette()
palette.setBrush(QPalette.Active, QPalette.Window, QBrush(QColor(255, 255, 255)))
app.setPalette(palette)

style = MyCustomStyle()
checkbox.setStyle(style)

window.show()
app.exec_()

上面的代码将复选框指示器改为了自定义图片。

示例演示

通过上述代码我们了解了如何添加指示器并且如何改变指示器的样式,下面给出两个具体的示例供参考:

示例一:标记已完成项

在一个任务管理应用程序中,我们想用复选框来标记已完成的任务。为了让已完成的任务在界面上更容易识别,我们采用使用自定义图片的方式。

from PyQt5.QtWidgets import QApplication, QMainWindow, QCheckBox
from PyQt5.QtGui import QPixmap, QBrush, QColor
from PyQt5.QtCore import Qt

class CompletedStyle(QProxyStyle):
    def drawComplexControl(self, control, option, painter, widget=None):
        if control == QStyle.CC_CheckBox:
            checkboxRect = self.subControlRect(QStyle.CC_CheckBox, option, QStyle.SC_CheckBoxIndicator, widget)
            if option.state & QStyle.State_Enabled:
                if option.state & QStyle.State_On:
                    pixmap = QPixmap('checked.png')
                else:
                    pixmap = QPixmap('unchecked.png')
                painter.drawPixmap(checkboxRect, pixmap)
app = QApplication([])
window = QMainWindow()

checkbox = QCheckBox('Task A')
window.setCentralWidget(checkbox)

palette = QPalette()
palette.setBrush(QPalette.Active, QPalette.Window, QBrush(QColor(255, 255, 255)))
app.setPalette(palette)

style = CompletedStyle()
checkbox.setStyle(style)

window.show()
app.exec_()

示例二:个性化样式

在本示例中,我们将改进前一个示例中的样式,使其更适合个性化。具体是通过自定义大小、颜色和边框来改善。

from PyQt5.QtWidgets import QApplication, QMainWindow, QCheckBox, QVBoxLayout
from PyQt5.QtGui import QPainter, QPixmap, QPalette, QColor, QBrush, QPen
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QStyle, QProxyStyle

class CustomCheckboxStyle(QProxyStyle):
    def drawComplexControl(self, control, option, painter, widget=None):
        if control == QStyle.CC_CheckBox:
            checkboxRect = self.subControlRect(QStyle.CC_CheckBox, option, QStyle.SC_CheckBoxIndicator, widget)
            pixmap = QPixmap('icon.png')
            painter.drawPixmap(checkboxRect, pixmap)
            pen = QPen(QColor(0, 0, 0))
            pen.setWidth(2)
            painter.setPen(pen)
            painter.drawRect(checkboxRect)

app = QApplication([])
window = QMainWindow()

layout = QVBoxLayout()
checkbox1 = QCheckBox('Option 1')
checkbox2 = QCheckBox('Option 2')
layout.addWidget(checkbox1)
layout.addWidget(checkbox2)

window.setLayout(layout)

palette = QPalette()
palette.setBrush(QPalette.Active, QPalette.Window, QBrush(QColor(255, 255, 255)))
app.setPalette(palette)

style = CustomCheckboxStyle()
checkbox1.setStyle(style)
checkbox2.setStyle(style)

window.show()
app.exec_()

以上就是完整的关于PyQt5中复选框右侧有指示器的使用攻略。