我想自定义QTabWidget,以便每个标签都有自己的背景颜色。我知道,这不能用样式表来完成,所以我将QTabBar子类化并更改了它的paintEvent。然后,我用我自己的实现替换了QTabWidget的默认QTabBar。但是,标签的背景颜色不会改变。有人知道我错过了什么吗?
这是一个小型演示应用程序,它说明了我的问题:
from PyQt4 import QtGui
import sys
class coloredTabBar(QtGui.QTabBar):
def __init__(self, parent = None):
QtGui.QTabBar.__init__(self, parent)
def paintEvent(self, event):
p = QtGui.QStylePainter(self)
painter = QtGui.QPainter(self)
for index in range(self.count()): #for all tabs
tab = QtGui.QStyleOptionTabV3() #create styled tab
self.initStyleOption(tab, index) #initialize with default values
#change background color to red
tab.palette.setColor(QtGui.QPalette.Base, QtGui.QColor(255, 0, 0))
p.drawControl(QtGui.QStyle.CE_TabBarTab, tab) #draw tab
class coloredTabWidget(QtGui.QTabWidget):
def __init__(self, parent = None):
QtGui.QTabWidget.__init__(self, parent)
coloredTabs = coloredTabBar()
self.setTabBar(coloredTabs) #replace default tabBar with my own implementation
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
tabWidget = coloredTabWidget()
tabWidget.addTab(QtGui.QWidget(), "Hello")
tabWidget.addTab(QtGui.QWidget(), "World")
tabWidget.show()
sys.exit(app.exec_())
亲切的问候
哈德
答案 0 :(得分:1)
您正在使用错误的调色板角色。您需要QPalette.Window
,这是常规窗口小部件背景颜色,而不是QPalette.Base
,它适用于更专业的元素,如编辑控件:
tab.palette.setColor(QtGui.QPalette.Window, QtGui.QColor(255, 0, 0))
但是,您应该知道以这种方式绘制标签不会在所有平台上运行。这是因为某些Windows和Mac样式在绘制标签时会使用像素图,因此不要考虑调色板更改。有关详细信息,请参阅此Qt FAQ。
答案 1 :(得分:1)
好吧,我想我得到了一些东西。这不是最漂亮的事情,但它可以解决问题。
如果有人对如何解决这个问题有更好的了解......请告诉我。
from PyQt4 import QtGui
from PyQt4 import QtCore
import sys
class coloredTabBar(QtGui.QTabBar):
def __init__(self, parent = None):
QtGui.QTabBar.__init__(self, parent)
def paintEvent(self, event):
p = QtGui.QStylePainter(self)
painter = QtGui.QPainter(self)
painter.save()
for index in range(self.count()): #for all tabs
tabRect = self.tabRect(index)
tabRect.adjust(-1, 3, -1, -1) #ajust size of every tab (make it smaller)
if index == 0: #make first tab red
color = QtGui.QColor(255, 0, 0)
elif index == 1: #make second tab yellow
color = QtGui.QColor(255, 255, 0)
else: #make all other tabs blue
color = QtGui.QColor(0, 0, 255)
if index == self.currentIndex(): #if it's the selected tab
color = color.lighter(130) #highlight the selected tab with a 30% lighter color
tabRect.adjust(0, -3, 0, 1) #increase height of selected tab and remove bottom border
brush = QtGui.QBrush(color)
painter.fillRect(tabRect, brush)
painter.setPen(QtGui.QPen(QtGui.QColor(QtCore.Qt.black))) #black pen (for drawing the text)
painter.drawText(tabRect, QtCore.Qt.AlignVCenter | QtCore.Qt.AlignHCenter,
self.tabText(index))
painter.setPen(QtGui.QPen(QtGui.QColor(QtCore.Qt.gray))) #gray pen (for drawing the border)
painter.drawRect(tabRect)
painter.restore()
class coloredTabWidget(QtGui.QTabWidget):
def __init__(self, parent = None):
QtGui.QTabWidget.__init__(self, parent)
coloredTabs = coloredTabBar()
self.setTabBar(coloredTabs) #replace default tabBar with my own implementation
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
tabWidget = coloredTabWidget()
tabWidget.addTab(QtGui.QWidget(), "Tab 1")
tabWidget.addTab(QtGui.QWidget(), "Tab 2")
tabWidget.addTab(QtGui.QWidget(), "Tab 3")
tabWidget.addTab(QtGui.QWidget(), "Tab 4")
tabWidget.show()
sys.exit(app.exec_())