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

时间:2011-08-22 14:41:02

标签: c++ python qt pyside

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'
PySide中似乎没有{p> qstyleoption_cast。如何将opt转换为其子类,即PySide.QtGui.QStyleOptionTab

2 个答案:

答案 0 :(得分:0)

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中没有“强制转换”概念。演员的概念是静态类型语言。我不太清楚如何解释PySide正在使用QStyleOption做什么。无论如何,通过调用类来创建实例(例如QStyleOptionTab(opt))会检查给定实例是否为“正确类型”,其中类型是C ++类型的概念。或者将它从超类QStyleOption转换为给定的子类。

答案 1 :(得分:0)

找到了一个小黑客风格的解决方案。

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