如何更改 PyQt4 中的 QStyle 属性?
Posted
技术标签:
【中文标题】如何更改 PyQt4 中的 QStyle 属性?【英文标题】:How can I change the QStyle properties in PyQt4? 【发布时间】:2011-02-26 10:03:05 【问题描述】:我想更改 PyQt 应用程序的 QStyle::PM_TabBarTabHSpace
属性。我阅读了Qt document for QStyle,但我不确定如何在 PyQt 中正确设置它。
非工作代码:
style = QStyleFactory.create('Cleanlooks')
style.PM_TabBarTabHSpace = 5 # 5 pixels?
app.setStyle(style)
此代码运行,但不会更改标签栏选项卡上的填充。我尝试使用样式表来更改标签栏填充,但这会破坏图形绘制,因此不会绘制任何默认外观的东西(我不想重新实现所有的 ui 绘制)。
我想我可能需要使用QProxyStyle,但我找不到任何关于如何在 PyQt4 中使用它的示例。 编辑: 看来 PyQt 没有 QProxyStyle,因为 from PyQt4.QtGui import QProxyStyle
失败了。
有人可以发布一个更改PM_TabBarTabHSpace
值的示例吗?谢谢。
编辑这是一个骨架代码。更改 PM_TabBarTabHSpace 值不会做任何事情。 :(
from PyQt4.QtGui import (QApplication, QTabWidget, QWidget,
QStyle, QStyleFactory)
def myPixelMetric(self, option=None, widget=None):
if option == QStyle.PM_TabBarTabHSpace:
return 200 # pixels
else:
return QStyle.pixelMetric(option, widget)
style = QStyleFactory.create('Windows')
style.pixelMetric = myPixelMetric
app = QApplication('test -style Cleanlooks'.split())
# Override style
app.setStyle(style)
tab = QTabWidget()
tab.addTab(QWidget(), 'one')
tab.addTab(QWidget(), 'two')
tab.show()
app.exec_()
【问题讨论】:
PyQt 的文档在这里:riverbankcomputing.co.uk/static/Docs/PyQt4/html/qstyle.html 我已经阅读了文档,但我仍然不确定如何设置PM_TabBarTabHSpace
。你能举个例子吗?
另外,文档只提供 C 示例,没有 Python 示例。这必须在 C 中完成吗?
我不太了解 Python,但我几乎可以肯定问题出在您覆盖 style.pixelMetric 的方式上。我不认为 Qt 调用了您对 pixelMetric 的实现。您是否尝试过从 QStyle 派生并在派生类中提供 pixelMetric 实现?
另外,style.PM_TabBarTabHSpace = 5
sn-p 不能工作,因为 QStyle 没有公共属性“PM_TabBarTabHSpace”。您尝试覆盖 pixelMetric 的第二个代码 sn-p 是正确的方法。
【参考方案1】:
QStyle.pixelMetric(...) 是内置的类方法。您不能通过函数指向进行设置。因为,它是用 C 代码编写的。您可以通过添加来测试它
def myPixelMetric(self, option=None, widget=None):
print 'Debug, i am calling'
...
在您的 myPixelmetric 函数中。您需要继承 Style 对象来实现这一点。这是一个例子:
class MyStyle(QCommonStyle):
def pixelMetric(self, QStyle_PixelMetric, QStyleOption_option=None, QWidget_widget=None):
if QStyle_PixelMetric == QStyle.PM_TabBarTabHSpace:
return 200
else:
return QCommonStyle.pixelMetric(self, QStyle_PixelMetric, QStyleOption_option, QWidget_widget)
app = QApplication('test -style Cleanlooks'.split())
app.setStyle(MyStyle())
这段代码 sn-p 可以工作,但是很难看。我更喜欢使用样式表而不是操纵样式。
【讨论】:
以上是关于如何更改 PyQt4 中的 QStyle 属性?的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式更改/更新 Python PyQt4 TableView 中的数据?