pyqt - 自定义 QComboBox 类样式重置为默认值

Posted

技术标签:

【中文标题】pyqt - 自定义 QComboBox 类样式重置为默认值【英文标题】:pyqt - Custom QComboBox class style resets to default 【发布时间】:2014-04-24 22:52:26 【问题描述】:

我正在使用自定义 ComboBox 类,因为我想为所有组合框标准化字体。我尝试了 3 种不同的方法,如下面的 pyqt 类定义所示:

class StandardComboBox(QComboBox):
    def _init_(self, parent = None):
        super(StandardComboBox, self).__init__(parent)
        self.setFont(QFont('Courier New', 30))                    #<<< 1
        self.setStyleSheet("font: 30pt \"Courier New\";")         #<<< 2

    def paintEvent(self, e):
        painter = QStylePainter( self )
        painter.setPen( self.palette().color( QPalette.Text ) )

        opt = QStyleOptionComboBox()
        opt.fontMetrics = QFontMetrics(QFont('Courier New', 30))  #<<<3
        self.initStyleOption( opt )
        painter.drawComplexControl( QStyle.CC_ComboBox, opt )

        painter.drawControl( QStyle.CE_ComboBoxLabel, opt)

调用类我所做的只是:

self.myComboBox = StandardComboBox()

但是,我的组合框仍然具有默认样式,而不是我设置的字体。我错过了什么?在组合框上再次调用 #1 或 #2 方法可以正确设置字体,但这违背了我的自定义类的目的。

【问题讨论】:

为什么需要覆盖绘画事件? 这只是我在简单地设置字体后尝试的东西不起作用。覆盖绘制事件修复了我曾经为 QWidget 遇到的类似问题。 我无法在这里测试,但不需要覆盖 【参考方案1】:

删除所有内容,将self.setFont(QFont(...)) 原样保留在__init__ 中。这对我有用。您的代码的问题在于,您对 init 方法使用了单个前导和尾随下划线。加上双下划线,def __init__(self, parent=None))

class StandardComboBox(QComboBox):
    def __init__(self, parent = None):
        super(StandardComboBox, self).__init__(parent)
        self.setFont(QFont('Courier New', 30))

这段代码足以改变comboBox的字体。

【讨论】:

【参考方案2】:

或者这也有效:

.setStyleSheet("QComboBox font: 14px 'monospace'; background-color: #fff; color: #000;border-style:solid;border-width:1px;border-color:#000;border-radius : 无; " );

【讨论】:

以上是关于pyqt - 自定义 QComboBox 类样式重置为默认值的主要内容,如果未能解决你的问题,请参考以下文章

单独设置 QComboBox 菜单项的样式 PyQt5

自定义实现 PyQt5 下拉复选框 ComboCheckBox

如何从另一个类 PyQT 向 QComboBox 添加项目?

QComboBox setMaxVisible() 不适用于融合风格

Qt,QStandarItemModel:自定义QComboBox上的委托项从模型的实例化器填充其内容

Python / PyQt4:如何使 QComboBox 项可拖动