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 转换为它的子类?的主要内容,如果未能解决你的问题,请参考以下文章
在 PySide 的 QTreeView 中更改时如何获取项目的先前名称
sectionList 中的自定义部分样式 REACT NATIVE