在不更改应用样式的情况下更改 QSpinBox 箭头大小

Posted

技术标签:

【中文标题】在不更改应用样式的情况下更改 QSpinBox 箭头大小【英文标题】:Change QSpinBox Arrow Size Without Changing App Style 【发布时间】:2021-02-23 12:00:34 【问题描述】:

我正在尝试找到一种方法来更改小部件的属性,例如组件的大小或各种边框和颜色,而不更改小部件的默认样式(在本例中为融合)。仍在尝试了解 PyQT 中的样式表,有人可以解释如何在不改变样式的情况下实现更大的箭头按钮吗?

提前致谢。

if __name__ == '__main__':
    app = QApplication(sys.argv)

    app.setStyle("fusion")
    #Trying to change the arrow size here, while maintaining their "fusion" style
    app.setStyleSheet("QSpinBox::up-button  width: 32px; "
                      "QSpinBox::down-button  width: 32px; ")
    windowExample = basicWindow()
    windowExample.show()
    sys.exit(app.exec_())


我也在为我的滑块使用代理样式以更改滑块大小,希望微调框有类似的东西:

class SliderProxyStyle(QProxyStyle):
    def pixelMetric(self, metric, option, widget):
        if metric == QStyle.PM_SliderThickness:
            return 20
        elif metric == QStyle.PM_SliderLength:
            return 40
        return super().pixelMetric(metric, option, widget)

【问题讨论】:

【参考方案1】:

如sub-controls documentation 底部所述,您不能使用简单的样式表:

对于 QComboBox 和 QScrollBar 等复杂的小部件,如果自定义了一个属性或子控件,则必须同时自定义所有其他属性或子控件。”

复杂的小部件还包括 QAbstractSpinBox 的所有子类,QSpinBox 继承自这些子类,因此如果您更改任何属性(背景和前景色除外),您必须提供其他所有内容,因为样式的基本实现将是通过使用基本的 QCommonStyle 作为后备来忽略。

唯一可行的解​​决方案是使用 QProxyStyle 并为 SC_SpinBoxUp、SC_SpinBoxDown 和 SC_SpinBoxEditField 实现 subControlRect:

class Proxy(QtWidgets.QProxyStyle):
    def subControlRect(self, control, opt, subControl, widget=None):
        rect = super().subControlRect(control, opt, subControl, widget)
        if control == self.CC_SpinBox:
            if subControl in (self.SC_SpinBoxUp, self.SC_SpinBoxDown):
                rect.setLeft(opt.rect.width() - 32)
            elif subControl == self.SC_SpinBoxEditField:
                rect.setRight(opt.rect.width() - 32)
        return rect

# ...
app = QtWidgets.QApplication(sys.argv)
app.setStyle(Proxy())
# ...

【讨论】:

尝试了这个没有任何运气,但它现在也将我的滑块更改为不同的格式,可能是因为它们已经被代理样式类改变了? @Jkind9 请注意,您应该在这些 spinboxes 上使用样式表:如前所述,如果您使用样式表,您将覆盖样式(这将使代理实施几乎没用)。关于滑块的问题来自这样一个事实,即根据样式,某些属性用于稍微相关的小部件,您可以确保 widget 是一个 QSpinBox 实例(或者甚至设置您自己的属性并检查它,如果您想设置样式不同方式的不同旋转框)。 (实际上,您也更改了滑块有点奇怪,因为它们不应该使用融合样式;确保您没有使用其他代理样式,或者您没有使用自定义样式表,如 QDarkStyleSheet。) 是的,我也尝试删除 app.setStyle(___) 行。除了融合之外,我没有使用任何样式表,并且我使用调色板来改变颜色。它似乎没有改变按钮的大小。我明白了,您能否编辑您的答案以显示我将如何纠正滑块问题?正如我所说的那样,我对 PyQt 很陌生! 如果您删除该行,将使用代理样式。检查您是否在任何父级(或 QApplication)中使用样式表。

以上是关于在不更改应用样式的情况下更改 QSpinBox 箭头大小的主要内容,如果未能解决你的问题,请参考以下文章

PyQt 在不重置样式的情况下更改 QPushButton 背景颜色

在不改变背景样式的情况下更改 jumbotron 中的文本

在不丢失 Html 样式的情况下更改 NSAttributedString 中的字体大小 - Swift

引导切换以使用 AJAX 在不刷新页面的情况下更改 MySQL TINYINT

在不播放音乐的情况下更改应用内的音量

在不更改 Windows 区域设置的情况下更改应用程序的区域设置