我该如何在PyQt4中更改QStyle属性?

4
我希望能够更改PyQt应用程序的QStyle::PM_TabBarTabHSpace属性。我阅读了Qt文档中关于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的文档在这里:http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qstyle.html - vettipayyan
我已经阅读了文档,但仍不确定如何设置 PM_TabBarTabHSpace。你能提供一个例子吗? - k107
1
我对Python不熟悉,但我几乎可以确定问题出在你覆盖style.pixelMetric的方式上。我认为Qt没有调用你的pixelMetric实现。你是否尝试从QStyle派生并在派生类中提供一个pixelMetric实现? - Stefan Monov
此外,style.PM_TabBarTabHSpace = 5 这个片段不起作用,因为 QStyle 没有公共属性“PM_TabBarTabHSpace”。你尝试重写 pixelMetric 的第二个代码片段是正确的方法。 - Stefan Monov
我从QStyle派生出了问题,因为我需要实现所有的QStyle方法(但我不知道如何正确地做)。我宁愿从QCleanlooksStyle或QWindowsStyle派生,并仅覆盖pixelMetric,但PyQt没有提供QCleanlooksStyle或QWindowsStyle类。 - k107
显示剩余2条评论
1个回答

4

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())

这段代码片段可以工作,但很丑陋。我更喜欢使用样式表而不是操纵Style。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接