PyQt5 – 为不可编辑的组合框的行编辑部分添加边框

为不可编辑的组合框的行编辑部分添加边框可以使用PyQt5中提供的QProxyStyle类。该类继承自QStyle类,它可以自定义组件的外观,包括颜色、大小、边框等。

完整使用攻略如下:

Step 1: 导入必要模块

首先,需要导入PyQt5中的必要模块,代码如下:

from PyQt5.QtWidgets import QComboBox, QStyleOptionComboBox, QProxyStyle
from PyQt5.QtCore import QSize

其中,QComboBox是组合框控件,QStyleOptionComboBox是样式选项接口,QProxyStyle是QStyle的子类,QSize控制控件大小。

Step 2: 自定义样式

接下来,需要通过自定义样式来添加QComboBox的边框。代码如下:

class ComboboxStyle(QProxyStyle):
    def subControlRect(self, control, option, subcontrol, widget=None):
        rect = super(ComboboxStyle, self).subControlRect(control, option, subcontrol, widget)
        if subcontrol == QStyle.SC_ComboBoxEditField:
            rect.adjust(3, 3, -3, -3)
        return rect

    def drawComplexControl(self, control, option, painter, widget=None):
        if control == QStyle.CC_ComboBox and option.currentIcon.isNull():
            comboRect = option.rect.adjusted(2, 2, -20, -2)
            arrowRect = QRect(option.rect.right() - 20, option.rect.top() + 2, 20, option.rect.height() - 4)
            fieldRect = QRect(comboRect.right() + 1, comboRect.top(), arrowRect.left() - comboRect.right() - 1, comboRect.height())

            pen = painter.pen()
            pen.setWidth(1)
            painter.setPen(pen)
            painter.drawRoundedRect(comboRect, 3, 1)
            painter.drawRoundedRect(fieldRect, 3, 1)
            painter.drawPolygon(QPoint(arrowRect.left() + 6, arrowRect.top() + 10),
                                QPoint(arrowRect.right() - 10, arrowRect.top() + 10),
                                QPoint(arrowRect.left() + 13, arrowRect.top() + 17))

            option_copy = QStyleOptionComboBox(option)
            option_copy.rect = fieldRect
            super(ComboboxStyle, self).drawComplexControl(control, option_copy, painter, widget)

这里自定义的ComboboxStyle类继承自QProxyStyle类,成为QComboBox的代理类,可以使用proxy()函数将其应用到QComboBox上。

subControlRect()函数是一个Qt中的虚函数,用于设定组件的边框。在这里,通过对QStyle的SC_ComboBoxEditField子控件的rect进行调整,来添加QComboBox的边框。

drawComplexControl()函数是用于绘制复杂控件,包括组合框、下拉框等。在这里,通过获取COMBOBOX字段的当前状态,来绘制框架、箭头和文本部分。

Step 3: 设置代理

最后,使用该代理类将样式应用于QComboBox上,代码如下:

combo = QComboBox()
combo.setEditable(True)
combo.lineEdit().setReadOnly(True)
combo.setItemDelegate(QStyledItemDelegate())
combo.setFixedHeight(30)
combo.setFixedWidth(150)
combo.currentIndexChanged.connect(lambda: print(combo.currentText()))

combo.setStyle(ComboboxStyle())

在这里,combo.setEditable(True)设置QComboBox的文本框为可编辑状态,combo.lineEdit().setReadOnly(True)设置为不可编辑状态,combo.setItemDelegate(QStyledItemDelegate())设置QComboBox的ItemDelegate为空,combo.setFixedHeight(30)设置高度为30,combo.setFixedWidth(150)设置宽度为150,combo.currentIndexChanged.connect(lambda: print(combo.currentText()))设置响应combo的值改变事件。

最后一行combo.setStyle(ComboboxStyle())将自定义的ComboboxStyle样式代理设置到QComboBox上。

示例1:自定义的ComboboxStyle应用到QComboBox上

from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QStyleOptionComboBox, QProxyStyle, QStyledItemDelegate
from PyQt5.QtCore import QSize, QRect, QPoint
import sys

class ComboboxStyle(QProxyStyle):
    def subControlRect(self, control, option, subcontrol, widget=None):
        rect = super(ComboboxStyle, self).subControlRect(control, option, subcontrol, widget)
        if subcontrol == QStyle.SC_ComboBoxEditField:
            rect.adjust(3, 3, -3, -3)
        return rect

    def drawComplexControl(self, control, option, painter, widget=None):
        if control == QStyle.CC_ComboBox and option.currentIcon.isNull():
            comboRect = option.rect.adjusted(2, 2, -20, -2)
            arrowRect = QRect(option.rect.right() - 20, option.rect.top() + 2, 20, option.rect.height() - 4)
            fieldRect = QRect(comboRect.right() + 1, comboRect.top(), arrowRect.left() - comboRect.right() - 1, comboRect.height())

            pen = painter.pen()
            pen.setWidth(1)
            painter.setPen(pen)
            painter.drawRoundedRect(comboRect, 3, 1)
            painter.drawRoundedRect(fieldRect, 3, 1)
            painter.drawPolygon(QPoint(arrowRect.left() + 6, arrowRect.top() + 10),
                                QPoint(arrowRect.right() - 10, arrowRect.top() + 10),
                                QPoint(arrowRect.left() + 13, arrowRect.top() + 17))

            option_copy = QStyleOptionComboBox(option)
            option_copy.rect = fieldRect
            super(ComboboxStyle, self).drawComplexControl(control, option_copy, painter, widget)

app = QApplication(sys.argv)
widget = QWidget()
layout = QVBoxLayout(widget)

combo = QComboBox()
combo.setEditable(True)
combo.lineEdit().setReadOnly(True)
combo.setItemDelegate(QStyledItemDelegate())
combo.setFixedHeight(30)
combo.setFixedWidth(150)
combo.currentIndexChanged.connect(lambda: print(combo.currentText()))

combo.setStyle(ComboboxStyle())

layout.addWidget(combo)
widget.show()
sys.exit(app.exec_())

示例2:自定义的ComboboxStyle应用到多个QComboBox上

from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QStyleOptionComboBox, QProxyStyle, QStyledItemDelegate
from PyQt5.QtCore import QSize, QRect, QPoint
import sys

class ComboboxStyle(QProxyStyle):
    def subControlRect(self, control, option, subcontrol, widget=None):
        rect = super(ComboboxStyle, self).subControlRect(control, option, subcontrol, widget)
        if subcontrol == QStyle.SC_ComboBoxEditField:
            rect.adjust(3, 3, -3, -3)
        return rect

    def drawComplexControl(self, control, option, painter, widget=None):
        if control == QStyle.CC_ComboBox and option.currentIcon.isNull():
            comboRect = option.rect.adjusted(2, 2, -20, -2)
            arrowRect = QRect(option.rect.right() - 20, option.rect.top() + 2, 20, option.rect.height() - 4)
            fieldRect = QRect(comboRect.right() + 1, comboRect.top(), arrowRect.left() - comboRect.right() - 1, comboRect.height())

            pen = painter.pen()
            pen.setWidth(1)
            painter.setPen(pen)
            painter.drawRoundedRect(comboRect, 3, 1)
            painter.drawRoundedRect(fieldRect, 3, 1)
            painter.drawPolygon(QPoint(arrowRect.left() + 6, arrowRect.top() + 10),
                                QPoint(arrowRect.right() - 10, arrowRect.top() + 10),
                                QPoint(arrowRect.left() + 13, arrowRect.top() + 17))

            option_copy = QStyleOptionComboBox(option)
            option_copy.rect = fieldRect
            super(ComboboxStyle, self).drawComplexControl(control, option_copy, painter, widget)

app = QApplication(sys.argv)
widget = QWidget()
layout = QVBoxLayout(widget)

combo1 = QComboBox()
combo1.setEditable(True)
combo1.lineEdit().setReadOnly(True)
combo1.setItemDelegate(QStyledItemDelegate())
combo1.setFixedHeight(30)
combo1.setFixedWidth(150)
combo1.currentIndexChanged.connect(lambda: print(combo1.currentText()))

combo2 = QComboBox()
combo2.setEditable(True)
combo2.lineEdit().setReadOnly(True)
combo2.setItemDelegate(QStyledItemDelegate())
combo2.setFixedHeight(30)
combo2.setFixedWidth(150)
combo2.currentIndexChanged.connect(lambda: print(combo2.currentText()))

ComboboxStyleInstance = ComboboxStyle()
combo1.setStyle(ComboboxStyleInstance)
combo2.setStyle(ComboboxStyleInstance)

layout.addWidget(combo1)
layout.addWidget(combo2)
widget.show()
sys.exit(app.exec_())

以上就是在PyQt5中为不可编辑的组合框的行编辑部分添加边框的完整使用攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyQt5 – 为不可编辑的组合框的行编辑部分添加边框 - Python技术站

(0)
上一篇 2023年5月10日
下一篇 2023年5月10日

相关文章

  • PyQt5 QSpinBox – 获得文本的正确方位值

    PyQt5 是 Python 语言下一个非常流行的 GUI 开发工具包。而 QSpinBox 就是 PyQt5 中的一个控件,它提供了一个简单的数字输入框,用户可以通过鼠标或键盘输入数字或点击箭头进行选择。QSpinBox 还提供了获取当前值和设置新值的方法。 在本篇文章中,我们将介绍如何使用 PyQt5 中的 QSpinBox 控件来获取当前选择的值,以及…

    python 2023年5月12日
    00
  • PyQt5 QListWidget – 获取drop indicator属性

    PyQt5是一种Python编程语言的GUI框架,其中包含了QListWidget控件,可以用来显示一系列列表数据。在使用QListWidget控件的过程中,有时需要获取dropindicator属性,以便在拖拽元素的时候进行相应的处理。下面将详细讲解如何使用PyQt5中的QListWidget控件获取dropindicator属性。 获取dropindic…

    python 2023年5月13日
    00
  • PyQt5 – 为单选按钮的未选指示灯设置背景色

    下面是PyQt5中为单选按钮的未选指示灯设置背景色的完整使用攻略。 1. PyQt5中的单选按钮 在PyQt5中,单选按钮是QRadioButton类的实例。它们的创建方式如下: radio_button = QRadioButton(‘Radio Button Text’, self) 其中’Radio Button Text’是单选按钮的文本,self是…

    python 2023年5月10日
    00
  • PyQt5 QCalendarWidget 获取选择模式

    PyQt5是一个强大的GUI编程工具包,提供了丰富的控件,其中QCalendarWidget控件用于显示日期。本文将详细讲解如何使用PyQt5 QCalendarWidget控件获取选择模式。 获取选择模式 QCalendarWidget控件的选择模式分为三种:单选模式、范围选择模式和多选模式。获取当前选择模式非常简单,只需要使用QCalendarWidge…

    python 2023年5月12日
    00
  • PyQt5 – 如何改变单选按钮的指示器边框

    下面是关于PyQt5中如何改变单选按钮指示器边框的使用攻略: 1. 理解单选按钮的指示器 在PyQt5中,单选按钮在被选中时会有一个用于指示选择状态的圆形或矩形指示器,也就是我们常说的按钮选中状态的小圆点或小矩形。这个指示器由两部分构成:一个默认不可见的空白圆形或矩形,以及一个可见的边框。默认情况下,边框是黑色的,我们可以通过改变按钮样式来改变这个边框的颜色…

    python 2023年5月10日
    00
  • PyQt5 QSpinBox – 设置对齐方式

    下面是关于 PyQt5 QSpinBox-设置对齐方式 的使用攻略。 1. 简介 QSpinBox 是一个可以让用户通过单击按钮或者手动输入来改变数值的控件。QSpinBox从QAbstractSpinBox继承而来,提供了一个数字输入框。 在PyQt5中,我们可以通过设置对齐方式来改变数字输入框中数字的位置。QSpinBox可以设置水平对齐和垂直对齐方式。…

    python 2023年5月12日
    00
  • PyQt5 – Check Box的setChecked()方法

    PyQt5是Python中一个强大的GUI编程框架,其中CheckBox就是常用的一种控件之一。在PyQt5中,有一个setChecked()方法,可以非常方便的设置CheckBox的选中状态。在本篇文章中,我们将详细讲解该方法的使用攻略。 一、setChecked()方法基本介绍 setChecked()方法是QCheckBox类中的一个函数,用于设置Ch…

    python 2023年5月11日
    00
  • PyQt5 QCalendarWidget 获取给定名称对应的属性值

    以下是关于Python的PyQt5 QCalendarWidget获取给定名称对应的属性值的完整使用攻略。首先,我们需要了解一下QCalendarWidget控件,它是一个可选的日期选择器控件,用于选择日期,而且可以根据需求自定义样式。QCalendarWidget类继承自QWidget类,因此具有QWidget的所有属性和方法,例如sizePolicy()…

    python 2023年5月12日
    00
合作推广
合作推广
分享本页
返回顶部