2

我有一个包含 QTabWidget 的 PyQt 主窗口。选项卡小部件包含一些按钮和文本框。

我想为整个标签背景着色,而不仅仅是标签栏区域中的标签。

我没有使用样式表,并且更喜欢使用调色板,因为我已经在使用调色板,但是如果样式表是唯一的选择,那没关系。

我试过了:

p = self.tabWidget.palette()
p.setColor(self.tabWidget.backgroundRole(), Qt.red)
self.tabWidget.setPalette(p)

这会产生一个红色的标签栏区域,但主背景仍然是白色的。

关闭自动填充,使用 self.tabWidget.setAutoFillBackground(False) 略有不同,各个选项卡现在颜色很好,但主体仍然是白色的。

尝试一个小样式表:

self.tabWidget.setStyleSheet("QWidget {background-color: yellow }")

这会为选项卡的主体着色,但也会将其他所有内容着色为黄色,包括按钮和文本框。此外,所有突出的小标签都是黄色的。自动填充没有任何影响。

关于如何为选项卡主体着色但不清除其他小部件的任何想法?

我正在使用 PyQt 4.10 版和 Python 2.7。

4

2 回答 2

4

使用 StyleSheet,您可以执行以下操作:

stylesheet = """ 
    QTabBar::tab:selected {background: gray;}
    QTabWidget>QWidget>QWidget{background: gray;}
    """

self.setStyleSheet(stylesheet)

人字形允许引用小部件的子级。它告诉 Qt 将样式表应用于应用程序中任何 QTabWidget 的孙子元素(请参阅Qt StlyleSheet syntax)。标签“body”是 QTabWidget 的孙子。

它的渲染效果不是很好,您将不得不调整一些设置。请参阅有关自定义 QTabWidget 和 QTabBar的 Qt 文档。

于 2013-11-06T09:11:03.173 回答
0

如果您只想为标签正文的背景着色,则设置其顶级内容小部件的背景角色:

    widget = QtGui.QWidget(tabwidget)
    widget.setAutoFillBackground(True)
    palette = widget.palette()
    palette.setColor(widget.backgroundRole(), QtCore.Qt.red)
    widget.setPalette(palette)
    # add layout and child widgets
    ...
    self.addTab(widget, label)

之前也出现过类似的问题,似乎在为选项卡着色时,样式表可能是唯一适用于所有平台的解决方案。不过,这完全取决于您要达到的目标。

对这个问题的回答重新实现了标签栏的绘制事件,并且效果很好——但仅限于 Linux。

于 2013-11-06T18:32:43.493 回答