PyQt4的:如何着色每个标签QTabWidget分开?(PyQt4: How to color e

2019-11-04 13:38发布

我正在使用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

Answer 1:

Unfortunally,QTabBar不会公开其所有属性,因为它的内容不是孩子的小部件以正常方式奠定了,但内部使用的私有方法得出。

有两种可能性,虽然。

  1. 手工绘制的TabBar,使用其的paintEvent。 使用将QStyle绘制*方法,就可以定制你想要的,而同时保持与当前主题的一致性; 这不是一件容易的事,但可以做到的。

  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: How to color each tab in QTabWidget separately?