簡體   English   中英

PyQt5中堆積小部件的透明背景

[英]Transparent Background for Stacked Widgets in PyQt5

我一直在嘗試使用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_())

根據文檔,問題是使用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)

下圖顯示了新輸出:

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM