2013-10-31 66 views
2

我试图水平显示我的QTabWidget文本,并将Tabposition设置为2(左侧)。经过搜索后,我发现this link的以下代码。Python PyQt4 Qpainter活动消息

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 

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

回答

2

painter.begin()painter.end()的调用是多余的,因为这些都是在创建和删除画家时自动完成的。对一个活跃的画家重新调用painter.begin()在技术上是一个错误,这就是为什么你看到这些警告。

如果您只是删除冗余线路,错误消息应该消失。

PS:

的另一种方法来解决该问题。将忽略传递self画家的构造。这会使画家未初始化,因此需要致电painter.begin(self)才能使其处于活动状态。

所以,总的来说,你应该做的之一:

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

或者只是:

painter = QtGui.QStylePainter(self) 
    ...