2

2 (左側) に設定して、QTabWidgetテキストを水平に表示しようとしていました。周りを検索した後、このリンクTabpositionから次のコードを見つけました。

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

すべてが期待どおりで、正常に動作しているように見えますが、タブの 1 つにマウスを合わせるたびに、このエラー メッセージが表示され続けます。

QPainter::begin: Painter already active

プログラムの機能には影響しませんが、このエラー メッセージの原因を知りたいです。簡単な説明で済みます。

4

1 に答える 1

3

painter.begin()およびへの呼び出しpainter.end()は冗長です。これらは両方とも、ペインタが作成および削除されるときに自動的に行われるためです。painter.begin()アクティブなペインタの再呼び出しは技術的にはエラーです。そのため、これらの警告が表示されます。

冗長な行を削除するだけで、エラー メッセージは表示されなくなります。

PS:

selfこの問題を解決する別の方法は、ペインタのコンストラクタへの引き渡しを省略することです。これにより、ペインタが初期化されないままになるため、ペインタをpainter.begin(self)アクティブにするために呼び出しが必要になります。

したがって、要約すると、次のいずれかを行う必要があります。

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

あるいは単に:

    painter = QtGui.QStylePainter(self)
    ...
于 2013-10-31T05:01:01.320 に答える