2015-11-03 92 views
2

我想用python制作一个简单的GUI桌面应用程序。如何让QTabWidget看起来透明?

我制作了一个带有背景图片的简单窗口,并在右上角添加了一个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

我认为这是一个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") 
+0

而在答案的链接可能会解决这个问题。你应该考虑在这个答案中添加一些代码。 –

+0

我按照建议添加了一个代码示例。 –

+0

谢谢凯文Eaverquepedo。我正在研究如何采用你的答案来处理我的代码。你的回答给我解决了一个问题。再次感谢你。 – passion053