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

2024-01-10

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

这是我的演示代码:

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 手动绘制选项卡栏。使用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) 来“初始化”它,因为仅在触发信号时才应用着色。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 在 case 内使用 if、else if、else 和循环进行切换

    出于我的问题的目的 我只包括案例 1 但其他情况是相同的 假设 value 当前为 1 我们转到情况 1 for 循环遍历数组以查看每个元素是否与whatever value 变量匹配 在这种情况下 如果确实如此 我们将 value 变量声
  • plupload 在 IE 9 中似乎无法上传文件。在其他浏览器中可以使用

    在我们的项目中 我们使用 plupload 上传单个 Excel 文件 这适用于除 IE9 之外的所有浏览器 单击上传链接时 会显示文件对话框 但尝试打开 Excel 时没有任何反应 以下是供参考的代码 任何解决此问题的帮助将不胜感激 提前
  • 人们如何使用 Entity Framework 6 进行单元测试,您应该担心吗?

    我刚刚开始进行单元测试和 TDD 我以前涉足过 但现在我决心将其添加到我的工作流程中并编写更好的软件 我昨天问了一个问题 其中包括这一点 但这似乎是一个独立的问题 我坐下来开始实现一个服务类 我将使用该服务类从控制器中抽象出业务逻辑 并使用
  • 获取当月日历中的所有日期

    如何获取当前 某个月份日历中的所有日期 例如本月 如图所示 所以结果是 07 31 2016 08 01 2016 08 02 2016 08 31 2016 09 01 2016 09 02 2016 09 03 2016 有什么想法吗
  • 查找 GeoTiff 图像中每个像素的纬度/经度坐标

    我目前有一个来自 GeoTiff 文件的 171 x 171 图像 尽管在其他情况下 我可能有更大的图像 我的目标是获取图像中的每个像素并将其转换为纬度 经度对 我已经能够根据此 StackOverflow 帖子将图像的角点转换为纬度 经度
  • 如何在多个测试类之间共享 JUnit BeforeClass 逻辑

    目前 我的所有 JUnit 测试都从一个公共基类扩展而来 该基类提供了标记为 BeforeClass and AfterClass注释 所有这些真正做的是设置一堆静态资源 服务供测试使用 由于以下几个原因 这对我来说似乎很尴尬 JUnit4
  • android - 检测向下加速度,特别是电梯

    我希望能够检测到手机向地面加速的情况 可能意味着这里也必须使用重力传感器 我在 Android 文档中阅读了很多有关此主题的内容 包括高通滤波器和低通滤波器以及其他帖子 现在我拥有的是一个代码示例 它在去除重力后获取 X Y 和 Z 轴的加
  • C++ cUrl 通过 api 向 telegram bot 发送图像 buff

    我正在尝试使用 c 将带有 cUrl 的图像 buff 发送到 telegram API 只是要知道我正在 Windows 10 上进行开发 这就是我所做的一切 首先 我使用以下命令从终端使用curl从硬盘发送一张照片 curl s X P
  • 使用条目模式时如何改变 HashMap 的其他元素?

    我想用一个HashMap缓存依赖于映射中其他条目的昂贵计算 条目模式仅提供对匹配值的可变引用 但不提供对其余部分的可变引用 HashMap 我非常感谢您提供更好的方法来解决这个 不正确的 玩具示例的反馈 use std collection
  • 在 TensorFlow 中创建列表并附加到其中

    我是 TensorFlow 新手 我无法理解如何在 TensorFlow 中创建动态 pythonic 列表 基本上 我对张量对象执行一些计算 train data i 并将其附加到 列表 中X 我想成为一个具有形状的张量 100 我想做这
  • 如果只有一个实例,我应该使用实例属性还是类属性? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有 Python 类 在运行时只需要一个实例 因此每个类 而不是每个实例 只需拥有一次属性就足够了 如果有多个实例 这不会发生 则所有实例都应
  • 有条件地设置 d3 符号

    我有一段代码 我试图根据传入的参数 0 或 1 动态确定要使用的符号和颜色 但是 当我尝试设置逻辑时 出现属性 d 的路径错误 代码如下 svg selectAll point data data enter append path att
  • 引用 Clojure 文件生成的类的 Java 文件出现 Leiningen 编译错误

    我有一个正在编译 Java 和 Clojure 文件的 Leiningen 项目 Java 文件导入一些从 Clojure 文件生成的类 带有 gen class 当我进行 lein 编译时 我在 Java 文件中的导入中遇到编译错误 说它
  • Python-生成时差

    我正在尝试生成一份使用情况统计报告 下面是我在数组中的示例数据 这是从 Mysql 表中获取的 如何实现一个逻辑 即如果用户空闲时间超过 30 分钟 他就会没有使用过该系统 否则计算使用时间的平均时间 timestamp for i in
  • 在 R 中使用 gsub 删除一对括号内的所有内容

    假设我有如下字符串 a b a
  • Checkmarx 扫描 - 如何修复 Missing_HSTS_Header 警告?

    在我的 Node js 应用程序上运行 Checkmarx 扫描后 我收到了中等严重程度的警告 gt 缺少 HSTS 标头 在这段仅返回metadata json文件内容的代码中 突出显示为错误源的是 res json const app
  • 未定义不是一个对象(评估 'Sn[e]')

    我在 Android 上遇到此错误 我找到了那行代码 Sn e 在我粘贴在下面的 index android bundle 中 ctrl command F for var An in Sn xn An Sn An for var Dn i
  • 在Python中表示二叉搜索树

    我如何在Python中表示二叉搜索树 class Node object def init self payload self payload payload self left self right 0 this concludes th
  • 初始化二维对象数组时出现 ArrayIndexOutOfBoundsException

    我有一个非常简单的问题 但我不明白为什么我会遇到这个异常 我正在尝试为数独谜题创建一个二维对象数组 但是当我初始化时 我得到了ArrayIndexOutOfBoundsException 请帮助 我读过类似的问题 它应该有效 在这里我声明网
  • PyQt4:如何分别为 QTabWidget 中的每个选项卡着色?

    我正在开发一个带有 GUI 的项目 为此我使用带有 PyQt4 模块的 Python 这是我的演示代码 import sys from PyQt4 import QtGui QtCore class Window QtGui QMainWi