我试图在QTabWidget设置为2(左侧)的情况下水平显示Tabposition文本。搜索后,我从this link找到了以下代码。

class FingerTabWidget(QtGui.QTabBar):
    def __init__(self, *args, **kwargs):
        self.tabSize = QtCore.QSize(kwargs.pop('width'), kwargs.pop('height'))
        super(FingerTabWidget, self).__init__(*args, **kwargs)

    def paintEvent(self, event):
        painter = QtGui.QStylePainter(self)
        option = QtGui.QStyleOptionTab()

        painter.begin(self)
        for index in range(self.count()):
            self.initStyleOption(option, index)
            tabRect = self.tabRect(index)
            tabRect.moveLeft(10)
            painter.drawControl(QtGui.QStyle.CE_TabBarTabShape, option)
            painter.drawText(tabRect, QtCore.Qt.AlignVCenter | QtCore.Qt.TextDontClip, self.tabText(index));
        painter.end()
    def tabSizeHint(self,index):
        return self.tabSize


我设法仅通过使用此代码来应用此代码

Tab = QtGui.QTabWidget()
Tab.setTabBar(FingerTabWidget(width=260,height=28))


一切看起来都和我期望的一样,并且工作正常,但是每次我将鼠标悬停在选项卡之一上时,我都会不断收到此错误消息。

QPainter::begin: Painter already active


即使它不影响我的程序的功能,我也想知道是什么导致了此错误消息。一个简单的解释就可以了。

最佳答案

painter.begin()painter.end()的调用是多余的,因为在创建和删除画图器时,它们都会自动完成。从技术上说,在活动的画家上调用painter.begin()是一个错误,这就是为什么您看到这些警告的原因。

如果仅删除冗余线路,则错误消息将消失。

PS:

解决此问题的另一种方法是忽略将self传递给painter的构造函数。这将使绘画者未初始化,因此需要调用painter.begin(self)使其激活。

因此,总而言之,您应该执行以下任一操作:

    painter = QtGui.QStylePainter()
    painter.begin(self)
    ...


要不就:

    painter = QtGui.QStylePainter(self)
    ...

关于python - Python PyQt4 Qpainter事件消息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19698430/

10-11 19:29