如何让QTabWidget看起来透明?

时间:2015-11-03 05:11:34

标签: python windows python-3.x pyqt pyqt5

我想使用python制作一个简单的GUI桌面应用程序。

我做了一个带背景图片的简单窗口,我在右上角添加了一个tab-widget。它运作正常。但是标签栏和标签内容区域是白色的。

我想要的是tab-widget的背景显示它的父窗口的背景图像(这意味着它是透明的)。但我不知道该怎么做。

这是我的工作环境,代码和屏幕截图:

工作环境

  • Windows 7
  • Python 3.4
  • PyQt5 5.5

源代码

# coding: utf-8

# There are some unnecessary module. 

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QLabel, QHBoxLayout, QVBoxLayout, QGridLayout
from PyQt5.QtGui import QPixmap, QPalette, QBrush, QColor
from PyQt5.QtCore import Qt

class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):

        tab1 = QWidget()
        tab2 = QWidget()

        vbox1 = self.makeTab1()
        vbox2 = self.makeTab2()

        tab1.setLayout(vbox1)
        tab2.setLayout(vbox2)

        tabs = QTabWidget()
        tabs.addTab(tab1, "firstTab")
        tabs.addTab(tab2, "secondTab")

        picLabel = QLabel(self)
        picFile = 'background_img.jpg'
        pixmap = QPixmap(picFile)
        palette = QPalette()
        palette.setBrush(QPalette.Background, QBrush(pixmap))

        hboxEX = QHBoxLayout()
        hboxEX.addStretch(2)
        hboxEX.addWidget(tabs)
        hboxEX.setStretchFactor(tabs, 1)

        vboxEX = QVBoxLayout()
        vboxEX.addStretch(1)
        vboxEX.addLayout(hboxEX)
        vboxEX.setStretchFactor(hboxEX, 1)

        self.setLayout(vboxEX)

        self.setPalette(palette)
        self.resize(pixmap.width(), pixmap.height())
        self.show()

    def makeTab1(self):
        lbl1 = QLabel(self)
        lbl2 = QLabel(self)
        lbl3 = QLabel(self)

        lbl1.setText("<a href=\"http://www.google.com\">Google</a>")
        lbl2.setText("<a href=\"https://www.wikipedia.org/\">WikiPedia</a>")
        lbl3.setText("<a href=\"http://www.stackoverflow.com\">StackOverflow</a>")

        lbl1.setOpenExternalLinks(True)
        lbl2.setOpenExternalLinks(True)
        lbl3.setOpenExternalLinks(True)

        vbox1 = QVBoxLayout()
        vbox1.addWidget(lbl1)
        vbox1.addWidget(lbl2)
        vbox1.addWidget(lbl3)

        return vbox1

    def makeTab2(self):
        lbl4 = QLabel(self)
        lbl5 = QLabel(self)
        lbl6 = QLabel(self)

        lbl4.setText("<a href=\"https://www.python.org/\">Python</a>")
        lbl5.setText("<a href=\"https://www.centos.org/\">CentOS</a>")
        lbl6.setText("<a href=\"https://mariadb.org/\">MariaDB</a>")

        lbl4.setOpenExternalLinks(True)
        lbl5.setOpenExternalLinks(True)
        lbl6.setOpenExternalLinks(True)

        vbox2 = QVBoxLayout()
        vbox2.addWidget(lbl4)
        vbox2.addWidget(lbl5)
        vbox2.addWidget(lbl6)

        return vbox2

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

截图

screenshot

我尝试了什么:

我添加了这些代码并更改了标签的颜色。但它没有使标签区看起来透明:

    tabPalette = QPalette()
    tabPalette.setColor(QPalette.Background, QColor("cyan"))
    tab1.setAutoFillBackground(True)
    tab1.setPalette(tabPalette)

1 个答案:

答案 0 :(得分:1)

我认为这是一个Windows问题。您可能希望尝试将应用程序切换为其他样式。

请参阅PyQt参考http://pyqt.sourceforge.net/Docs/PyQt4/qstyle.html

的此页面

一些示例代码:

def changeStyle(self, styleName):
    QtGui.QApplication.setStyle(QtGui.QStyleFactory.create(styleName))
    self.changePalette()

用它来表示:

changeStyle("plastique")