2

我正在尝试通过QProxyStyle.

我创建了一个StyleCustom类,该类drawControl根据选项卡状态将选项卡绘制为红色或绿色,并在其顶部添加文本。

但是,使用option.text给我以下错误:

AttributeError: 'PySide2.QtWidgets.QStyleOption' object has no attribute 'text'

我注意到这里应该是optionQStyleOptionTab如果我没记错的话。QStyleOption

如果我评论该drawText命令,则不会崩溃,但选项卡未按应有颜色显示:

结果窗口

我觉得不知何故,该drawControl方法没有正确接收选项。在尝试绘制其他控件类型时,我注意到了类似的行为。

这是一个使用 a 的基本示例QTabWidget

from PySide2 import QtWidgets, QtGui, QtCore

class StyleCustom(QtWidgets.QProxyStyle):

    def drawControl(self, element: QtWidgets.QStyle.ControlElement, option: QtWidgets.QStyleOption, painter: QtGui.QPainter, widget:QtWidgets.QWidget=None):
        if element == QtWidgets.QStyle.ControlElement.CE_TabBarTabLabel:
            if option.state == QtWidgets.QStyle.State_Selected:
                painter.save()
                painter.fillRect(option.rect, QtGui.QBrush("#ff0000"))
                painter.restore()
            else:
                painter.save()
                painter.fillRect(option.rect, QtGui.QBrush("#00ff00"))
                painter.restore()
            painter.drawText(option.rect, QtCore.Qt.AlignCenter, option.text)
        else:
            return super().drawControl(element, option, painter, widget)

class MyMainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.tab = QtWidgets.QTabWidget()
        self.widg_1 = QtWidgets.QWidget()
        self.widg_2 = QtWidgets.QWidget()
        self.setCentralWidget(self.tab)
        self.tab.addTab(self.widg_1, "test1")
        self.tab.addTab(self.widg_2, "test2")

if __name__=='__main__':
    app = QtWidgets.QApplication()
    app.setStyle(StyleCustom())
    window = MyMainWindow()
    window.show()
    app.exec_()
4

1 回答 1

4

通常情况下,强制转换是在 PySide(以及 PyQt)中默认完成的,但在这种情况下,使用 shiboken2 似乎不太可能的解决方案:

import shiboken2
from PySide2 import QtWidgets, QtGui, QtCore


class StyleCustom(QtWidgets.QProxyStyle):
    def drawControl(
        self,
        element: QtWidgets.QStyle.ControlElement,
        option: QtWidgets.QStyleOption,
        painter: QtGui.QPainter,
        widget: QtWidgets.QWidget = None,
    ) -> None:
        if element == QtWidgets.QStyle.ControlElement.CE_TabBarTabLabel:
            (cpp_pointer,) = shiboken2.getCppPointer(option)
            option_tab = shiboken2.wrapInstance(cpp_pointer, QtWidgets.QStyleOptionTab)

            painter.save()
            painter.fillRect(
                option_tab.rect,
                QtGui.QBrush(
                    "#ff0000"
                    if option_tab.state == QtWidgets.QStyle.State_Selected
                    else "#00ff00"
                ),
            )
            painter.restore()
            painter.drawText(option_tab.rect, QtCore.Qt.AlignCenter, option_tab.text)
        else:
            super().drawControl(element, option, painter, widget)
于 2021-05-28T17:21:30.927 回答