PyQt5中用于堆叠小部件的透明背景

6
我一直在尝试使用PyQt5创建一个基本的时钟。时钟部分可以工作,时钟背后的背景图像也加载了,但我无法使文本的背景透明。
我已经尝试了下面列出的方法,以及使用self.lbl1.setStyleSheet("background-color: rgba(255, 255, 255, 10);"),但两种情况下得到的结果都是相同的。
如果我设置layout.setCurrentIndex(0),我会看到背景jpeg图像,所以它加载得非常好。
有什么想法可以让我拥有带有透明度的分层小部件吗?
为了更清楚地解释一下:
这是我得到的: 这是我想要的:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        layout = QStackedLayout()


        #Background area test
        self.background = QLabel(self)
        self.background.setPixmap(QPixmap("image.jpeg"))
        self.background.show()
        #self.background.setAutoFillBackground(True)

        #Setup text area for clock
        newfont = QFont("Consolas",120, QFont.Bold)
        self.lbl1 = QLabel()
        self.lbl1.setAlignment(Qt.AlignCenter)
        self.lbl1.setFont(newfont)
        self.lbl1.setWindowFlags(Qt.FramelessWindowHint)
        self.lbl1.setAttribute(Qt.WA_TranslucentBackground)

        #Timer to refresh clock
        timer = QTimer(self)
        timer.timeout.connect(self.showTime)
        timer.start(1000)
        self.showTime()



        #layout area for widgets

        layout.addWidget(self.background)
        layout.addWidget(self.lbl1)
        layout.setCurrentIndex(1)
        self.setLayout(layout)
        self.setGeometry(300,300,250,150)
        self.show()

    def showTime(self):
        time = QTime.currentTime()
        text = time.toString('hh:mm')
        if (time.second() % 2) == 0:
            text = text[:2] + ' ' + text[3:]
        self.lbl1.setText(text)


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

1
你可以展示一张你得到的图片和想要得到的图片,这将大大澄清你的问题。 - eyllanesc
1
@eyllanesc 是的,可以做到。我在我的问题中添加了一些图片,展示了它目前的状态以及我希望它能够实现的功能。 - Klankins
1个回答

6
问题在于使用QStackedWidget,根据文档:
QStackedLayout类提供了一个小部件堆栈,其中一次只能看到一个小部件。
这告诉我们只有一个小部件是可见的。这就是为什么图片没有显示的原因,为了强制它们可见,我们使用:
layout.setStackingMode(QStackedLayout.StackAll)

获取以下内容:

在这里输入图片描述

如文档中所述,QStackedlayout用于一次显示一个小部件。在您的情况下,我认为这是不必要的,您可以仅使用标签和任何布局,您可以使用styleSheet来放置背景图像,以下代码显示了我的意思。

class Example(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent=parent)
        self.initUI()

    def initUI(self):
        self.setGeometry(300,300,250,150)
        layout = QVBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        newfont = QFont("Consolas",120, QFont.Bold)
        self.lbl1 = QLabel(self)
        self.lbl1.setStyleSheet("border-image:url(image.jpeg);")
        self.lbl1.setAlignment(Qt.AlignCenter)
        self.lbl1.setFont(newfont)
        layout.addWidget(self.lbl1)

        #Timer to refresh clock
        timer = QTimer(self)
        timer.timeout.connect(self.showTime)
        timer.start(1000)
        self.showTime()
        self.show()

    def showTime(self):
        time = QTime.currentTime()
        text = time.toString('hh:mm')
        if (time.second() % 2) == 0:
            text = text[:2] + ' ' + text[3:]
        self.lbl1.setText(text)

下图展示了新的输出结果:

在此输入图片描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接