PySide 中的自定义样式支持,如何将 QStyleOption 转换为它的子类?

Posted

技术标签:

【中文标题】PySide 中的自定义样式支持,如何将 QStyleOption 转换为它的子类?【英文标题】:Customized style support in PySide, how to cast QStyleOption to it's subclass? 【发布时间】:2011-08-22 14:41:02 【问题描述】:
class VisualStyle(QCleanlooksStyle):
    def drawControl(self, ce, opt, p, w):
        if ce == QStyle.CE_TabBarTabShape:
            print(opt.__class__) # opt is always the type 'PySide.QtGui.QStyleOption'

qstyleoption_cast 在 PySide 中似乎不可用。如何将 opt 转换为其子类,即 PySide.QtGui.QStyleOptionTab

【问题讨论】:

【参考方案1】:
myStyleOptionTab = QStyleOptionTab(opt)

PySide 文档中的另一个示例:

def drawPrimitive(self, element, option, painter, widget):
    if element == self.PE_FrameFocusRect:
        focusRectOption =  QStyleOptionFocusRect(option)
        if focusRectOption:
            # ...

PySide 文档有些乱码,因为它们神奇地源自 C++ 文档?但是通常示例中的 Python 代码是正确的吗?

Python 中没有“强制转换”的概念。 cast 的概念适用于静态类型语言。我不太确定如何解释 PySide 对 QStyleOption 的作用。无论如何,通过调用类(例如 QStyleOptionTab(opt))来创建实例会检查给定的实例是“正确的类型”,其中类型是 C++ 类型的概念。或者将它从超类 QStyleOption 转换为给定的子类。

【讨论】:

尽管 Python 是一种弱类型语言,但它仍然支持强制转换,实际上有时需要。 这不适用于 PySide2,你会得到这个错误:TypeError: 'PySide2.QtWidgets.QStyleOptionButton' called with wrong argument types: PySide2.QtWidgets.QStyleOptionButton(QStyleOption) Supported signatures: PySide2.QtWidgets.QStyleOptionButton() PySide2.QtWidgets.QStyleOptionButton(PySide2.QtWidgets.QStyleOptionButton) PySide2.QtWidgets.QStyleOptionButton(int) 显然它没有正确包装【参考方案2】:

找到了一些 hack 风格的解决方案。

def drawPrimitive(self, element, option, painter, widget):
    if element == self.PE_FrameFocusRect:
        opt = QStyleOptionFocusRect()
        widget.initStyleOption(opt) # this is private, but python has no private methods ;)

【讨论】:

以上是关于PySide 中的自定义样式支持,如何将 QStyleOption 转换为它的子类?的主要内容,如果未能解决你的问题,请参考以下文章

wordpress中的自定义导航栏。如何正确设置样式?

“导航项中不支持普通样式”警告我的自定义条形按钮项

在 PySide 的 QTreeView 中更改时如何获取项目的先前名称

sectionList 中的自定义部分样式 REACT NATIVE

无法使用 styled-components 将样式应用于 React Native 中的自定义组件?

如何利用Excel实现BibTex格式参考文献的自定义编辑?