在不更改应用样式的情况下更改 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 背景颜色
在不丢失 Html 样式的情况下更改 NSAttributedString 中的字体大小 - Swift