在 PyQt4 中修改系统样式

Posted

技术标签:

【中文标题】在 PyQt4 中修改系统样式【英文标题】:Modifying System Style in PyQt4 【发布时间】:2017-09-05 22:11:29 【问题描述】:

我正在尝试使启用三态的 QtCheckBox 在其状态为部分时在复选框中绘制一个 X。我目前让 Qt 处理样式以使其与操作系统匹配,并且我想保持这种方式并且只更改复选框的绘制方式。

我一直试图通过覆盖 Qt 使用的 QStyle 来做到这一点。我测试了 Qt 默认使用的样式:

>>> app = QtGui.QApplication()
>>> type(app.style())
PyQt4.QtGui.QCommonStyle

但是当我尝试运行 app.setStyle(QtGui.QCommonStyle()) 时,GUI 发生了变化,最明显的是复选标记从 QCheckBoxes 中消失了。

我查了QCommonStyle,根据文档,它只绘制了所有样式共有的元素。

所以我有两个问题:

    为什么type(app.style())返回QCommonStyle,而看起来使用的样式实际上不是QCommonStyle? 如何真正获得 Qt 使用的样式?

我正在使用 PyQt4。

【问题讨论】:

【参考方案1】:

为什么 type(app.style()) 返回 QCommonStyle,当它看起来 使用的样式居然不是QCommonStyle?

样式类使用的类一般继承QCommonStyle,例如在我的例子中,我有以下样式:

for key in QtGui.QStyleFactory.keys():
    st = QtGui.QStyleFactory.create(key)
    print(key, st.metaObject().className(), type(app.style()))

输出:

Adwaita-Dark Adwaita::Style   <class 'PyQt4.QtGui.QCommonStyle'>
Adwaita      Adwaita::Style   <class 'PyQt4.QtGui.QCommonStyle'>
Breeze       Breeze::Style    <class 'PyQt4.QtGui.QCommonStyle'>
bb10dark     QBB10DarkStyle   <class 'PyQt4.QtGui.QCommonStyle'>
bb10bright   QBB10BrightStyle <class 'PyQt4.QtGui.QCommonStyle'>
cleanlooks   QCleanlooksStyle <class 'PyQt4.QtGui.QCommonStyle'>
gtk2         QGtkStyle        <class 'PyQt4.QtGui.QCommonStyle'>
cde          QCDEStyle        <class 'PyQt4.QtGui.QCommonStyle'>
motif        QMotifStyle      <class 'PyQt4.QtGui.QCommonStyle'>
plastique    QPlastiqueStyle  <class 'PyQt4.QtGui.QCommonStyle'>
qt5ct-style  Qt5CTProxyStyle  <class 'PyQt4.QtGui.QCommonStyle'>
QtCurve      QtCurve::Style   <class 'PyQt4.QtGui.QCommonStyle'>
Windows      QWindowsStyle    <class 'PyQt4.QtGui.QCommonStyle'>
Fusion       QFusionStyle     <class 'PyQt4.QtGui.QCommonStyle'>

而我们观察到的都是这种类型。

我如何真正获得 Qt 使用的样式?

上一部分已经回答了:

print(QtGui.QApplication.style().metaObject().className())

就我而言:

Adwaita::Style

【讨论】:

以上是关于在 PyQt4 中修改系统样式的主要内容,如果未能解决你的问题,请参考以下文章

如何在样式表中使用非标准自定义字体?

网页换肤效果 系统界面切换皮肤样式

如何在word中应用和修改样式

Android开发主题样式详解

如何修改Android App的样式风格

vue修改当前页样式不影响公共样式的方法