如何更改 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 中的数据?

如何在 OS X 上的 PyQt4 中更改应用程序菜单名称

PyQt4中GridLayout中的对齐

从 QWidget (PyQt4) 调用 QMainWindow 中的方法/属性

如何更改组合框PyQt4中第一项的字体大小

如何使用 QStyle 和指定的 QSS 绘制控件?