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 QCalendarWidget 为抽象视图设置边框

    Python的PyQt5库提供了QCalendarWidget模块,该模块允许我们在应用程序中添加可以选择日期的日历控件。在实际开发中,我们可能需要为这个控件设置边框来使其更具有可读性。下面是设置PyQt5 QCalendarWidget抽象视图边框的完整使用攻略。 设置QCalendarWidget的边框 您可以通过在PyQt5 QCalendarWidg…

    python 2023年5月12日
    00
  • PyQt5 – 如何向组合框中添加多个项目

    使用PyQt5向组合框中添加多个项目,需要用到QtWidgets.QComboBox类和addItem()方法。 以下是完整的使用攻略: 1. 导入所需模块 from PyQt5 import QtWidgets 2. 创建组合框对象 combo = QtWidgets.QComboBox() 3. 添加单个项目 combo.addItem("项目…

    python 2023年5月10日
    00
  • PyQt5 QCalendarWidget 设置对象名称属性

    让我来为您详细介绍一下如何在PyQt5中设置QCalendarWidget对象名称属性。 什么是QCalendarWidget QCalendarWidget是PyQt5中的一个日历控件,允许用户选择日期并在应用程序中使用。 如何设置QCalendarWidget的对象名称属性 要在PyQt5中设置QCalendarWidget对象名称属性,可以使用setO…

    python 2023年5月11日
    00
  • PyQt5 – 当被按下时为中间的复选框设置皮肤

    要为一个PyQt5应用程序中的复选框设置皮肤,需要遵循以下步骤: 1.导入必要的库 首先需要导入PyQt5和一些其它必要的库,例如QtCore、QtGui和QtWidgets,代码如下: from PyQt5 import QtCore, QtGui, QtWidgets 2.创建一个注重样式的复选框 为了创建一个注重样式的复选框,可以创建一个新的类,该类可…

    python 2023年5月11日
    00
  • PyQt5 QCommandLinkButton – 检验检查状态

    PyQt5是一种常用的GUI(图形用户界面)开发框架,其中的QCommandLinkButton是一个常用的QPushButton派生类,用于显示一个带有图标的按钮,通常用于对具有确定操作结果的命令进行执行,同时也允许检查这些操作的执行状态。本文将详细介绍如何使用QCommandLinkButton进行状态检验。 1. 安装PyQt5 在正式进行PyQt5 …

    python 2023年5月12日
    00
  • PyQt5 QCalendarWidget 使光标形状恢复正常

    PyQt5 是 Python 语言的一种 GUI 编程工具包,它提供了一套绑定了 Qt 库的 Python 类库,该库是一个跨平台的图形用户界面(GUI)应用开发框架,非常适用于大型应用程序的开发。PyQt5 中的 QCalendarWidget 是一个日历控件,它可以显示一个日历,并允许用户选择日期。有时候,在使用 QCalendarWidget 过程中,…

    python 2023年5月12日
    00
  • PyQt5 QSpinBox – 获取整个文本

    PyQt5是Python的一个GUI框架,提供了一系列的控件,包括 QSpinBox。QSpinBox 是一个输入数字的控件, 用户可以通过滚动或手动输入来改变数值。在很多情况下,我们需要获取 QSpinBox 控件中的整数,这就需要用到获取整个文本的方法。 PyQt5 QSpinBox-获取整个文本 要获取 QSpinBox 的整个文本,可以使用其 tex…

    python 2023年5月12日
    00
  • PyQt5 QSpinBox – 设置属性

    PyQt5是Python中一个强大的GUI库,QSpinBox是其中一个常用的控件。QSpinBox提供了一个用于输入数字的旋转框,通常用于调整数值。在使用QSpinBox时,经常需要针对其属性进行设置和修改。下面将详细讲解如何使用”PyQt5 QSpinBox-设置属性”。 1. 基本属性设置 (1)设置初始值 设置初始值需要使用setvalue()函数,…

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