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 – 当鼠标悬停在单选按钮上时,选中的指示灯的背景颜色

    PyQt5是Python语言的GUI编程工具包,可以在Python中创建可视化窗口界面和交互式应用程序。单选按钮是GUI界面中常用的控件之一,但是在不同的交互场景下,我们可能需要为选中的单选按钮提供指示灯来辅助用户的交互体验。本篇攻略将详细讲解如何在PyQt5中实现当鼠标悬停在单选按钮上时,选中的指示灯的背景颜色的效果。 步骤一:安装PyQt5 在使用PyQ…

    python 2023年5月10日
    00
  • PyQt5 QListWidget – 获取垂直滚动模式属性

    使用PyQt5的QListWidget,我们可以通过获取列表控件的属性来控制其滚动模式,包括垂直滚动模式。以下是完整的使用攻略,包括代码示例: 1. 设置垂直滚动模式属性 可以通过setVerticalScrollMode()方法设置垂直滚动模式属性,该方法的参数可以是以下三个值: QAbstractItemView.ScrollPerPixel: 每像素滚…

    python 2023年5月13日
    00
  • PyQt5 – 如何在状态栏中添加分隔符

    当我们在使用Python的PyQt5库进行GUI编程的时候,经常需要在界面的状态栏中添加一些信息,如状态提示、进度条等等。为了更好地呈现这些信息,我们可能需要在状态栏中添加分隔符来分开不同的信息。下面是如何在状态栏中添加分隔符的完整使用攻略: 引入模块和基本设置 首先,我们需要在程序中引入PyQt5库中的QMainWindow和QStatusBar模块。并在…

    python 2023年5月10日
    00
  • PyQt5 QSpinBox – 设置基础尺寸

    PyQt5是Python语言的GUI编程库,它可以帮助我们快速进行界面编程。而QSpinBox是PyQt5库中的一个小部件(widget),可以用于设置一个整数值的范围,并提供了加、减按钮和调整步长等属性。 要设置QSpinBox的基础尺寸,我们可以使用QWidget的resize()方法或setFixedSize()方法。下面我们通过两个示例来进行说明: …

    python 2023年5月12日
    00
  • PyQt5 如何获得按钮的文本

    在PyQt5中获取按钮的文本,可以通过Qt5中提供的QPushButton类来实现。具体步骤如下: 导入PyQt5.QtWidgets模块下的QPushButton类 from PyQt5.QtWidgets import QPushButton 实例化QPushButton按钮控件,并设置按钮的文本(text)属性 button = QPushButton…

    python 2023年5月10日
    00
  • PyQt5 QComboBox 当它不可编辑并被按下时改变边框样式

    下面是Python的“PyQt5 QComboBox当它不可编辑并被按下时改变边框样式”的完整使用攻略。 1. 简介 QComboBox是PyQt5中的一个重要的组件之一,它能够显示一个下拉列表,而用户可以通过鼠标或者键盘来选择一个选项。本攻略将介绍在QComboBox不可编辑并被按下时如何改变它的边框样式。 2. 实现方法 在PyQt5中,我们可以通过QP…

    python 2023年5月12日
    00
  • PyQt5 QSpinBox – 设置左边距

    PyQt5是Python中常用的GUI框架,其中的QSpinBox控件可以用来选择整数值。在使用QSpinBox时,有时我们需要设置它的左边距,以便在布局中更好地控制控件的位置和间距。 可以使用setStyleSheet函数来设置QSpinBox控件的左边距,示例代码如下: from PyQt5.QtWidgets import QApplication, …

    python 2023年5月12日
    00
  • PyQt5 QCommandLinkButton – 获取自动独占属性

    下面我为你详细讲解Python中PyQt5库的QCommandLinkButton模块中的“获取自动独占属性”的使用攻略。 简介 在PyQt5的GUI编程中,QCommandLinkButton类是一个带有按钮和描述文字的组合控件,它常用于展示应用程序中的帮助内容或者指导用户进行特定操作的按钮。而“自动独占属性”指的是在点击该按钮时,如果设置为True,则按…

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