PyQt4:如何分别为QTabWidget中的每个选项卡着色?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PyQt4:如何分别为QTabWidget中的每个选项卡着色?相关的知识,希望对你有一定的参考价值。

我正在开发一个带有GUI的项目,我正在使用Python和PyQt4模块。

这是我的演示代码:

import sys
from PyQt4 import QtGui, QtCore

class Window(QtGui.QMainWindow):

    def __init__(self):
        super(Window, self).__init__()
        self.setWindowTitle('PyQt4 demo')
        self.setGeometry(50, 50, 1000, 1000)
        self.createTabs()
        self.styleTabs()
        self.show()

    def createTabs(self):
        '''Creates a QTabWidget with 5 tabs,
        named 1, 2, 3, 4, 5
        '''

        self.tabs = QtGui.QTabWidget(self)
        self.tabs.resize(1000, 1000)

        contents1 = QtGui.QWidget()
        contents2 = QtGui.QWidget()
        contents3 = QtGui.QWidget()
        contents4 = QtGui.QWidget()
        contents5 = QtGui.QWidget()

        self.tabs.addTab(contents1, '1')
        self.tabs.addTab(contents2, '2')
        self.tabs.addTab(contents3, '3')
        self.tabs.addTab(contents4, '4')
        self.tabs.addTab(contents5, '5')

    def styleTabs(self):
        #Would like to add some code here which colors
        #each tab with a different color.
        pass


def run():
    app = QtGui.QApplication(sys.argv)
    GUI = Window()
    sys.exit(app.exec_())

run()

大多数对象(包括QtabWidget和QTabBar)使用.setStyleSheet(str)方法支持CSS样式。但有了这个,我只能用相同的颜色着色所有标签。我还找到了一种方法来选择颜色,第一个,最后一个选项卡,但是永远不能为标签着色:索引为2。

例如:

self.tabs.setStyleSheet('''
    QTabBar::tab {background-color: green;}
    QTabBar::tab:selected {background-color: red;}
    QTabBar::tab:first {background-color: red;}
    QTabBar::tab:last {background-color: red;}
    ''')

我也尝试将颜色应用到当前的QTabBar。这适用于Qt,但显然不适用于PyQt:

tab = self.tabs.tabBar()
tab.setStyleSheet('background-color: grey;')

PyQt4着色方法也不起作用:

plt = QtGui.QPalette()
clr = QtGui.QColor()
clr.setRgb(100, 100, 100)
plt.setColor(10, clr)
tab.setPalette(plt)

我一直在网上搜索很多,但没有找到任何解决这个问题的方法。在这一点上,我甚至不确定是否存在简单的解决方案。

有没有办法修改PyQt4源代码,所以可以应用上述技术之一?

附加信息:

  • Python 3.4版
  • PyQt版本4.12
答案

不幸的是,QTabBar没有公开它的所有属性,因为它的内容不是以正常方式布局的子窗口小部件,而是使用私有方法在内部绘制。

但是,有两种可能性。

  1. 使用paintEvent手动绘制tabbar。使用QStyle draw *方法,可以根据需要自定义它,同时保持与当前主题的一致性;这不是一件容易的事,但可以做到。
  2. 仅自定义当前所选选项卡的背景:使用QTabBar的currentChanged信号,您可以在每次更改当前索引时轻松重置样式表

这是一个例子:

def createTabs(self):
    #[create your tabs, then...]
    self.tabColors = {
        0: 'green', 
        1: 'red', 
        2: 'yellow', 
        3: 'orange', 
        4: 'blue', 
        }
    self.tabs.tabBar().currentChanged.connect(self.styleTabs)

[...]

def styleTabs(self, index):
    self.tabs.setStyleSheet('''
        QTabBar::tab {{}}
        QTabBar::tab:selected {{background-color: {color};}}
        '''.format(color=self.tabColors[index]))

您可能希望在首次显示窗口小部件时通过调用styleTabs(0)来“初始化”它,因为仅在触发信号时应用着色。

以上是关于PyQt4:如何分别为QTabWidget中的每个选项卡着色?的主要内容,如果未能解决你的问题,请参考以下文章

PyQt4:如何/何时从 QTabWidget 的子类发出自定义信号?

PyQt4 菜单操作以将新选项卡添加到 QTabWidget

PyQt4 QTabWidget TAB CHANGE....currentChange(int) 不起作用

pyQt4 QTabWidget setMovable 使用自定义 QTabBar 崩溃

更改 PYQT4 中选项卡的背景颜色

PyQt4 - 自定义小部件类结构?