簡體   English   中英

如何僅編輯 PyQT5 小部件的背景顏色

[英]How to edit only background-color for PyQT5 widgets

我在 PyQT5 中遇到了 styles 的問題。我想修改“Fusion”樣式中的一些內容:當頁面失去焦點時,某些小部件的藍色變為白色,我希望它們保持藍色。

但是當我嘗試只編輯 QprogressBar 的背景顏色時,文本不再居中並且還有一些其他變化。 ( app.setStyleSheet("QProgressBar::chunk { background-color: blue}") )

我還嘗試app.my_progress_bar.setStyleSheed("background-color: blue")這似乎使文本居中但我不知道如何為“塊”項目做這件事。

如果你想測試一個解決方案,這里有一個小腳本:

import sys
import time
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QWidget, QPushButton, QProgressBar, QVBoxLayout, QApplication

class Thread(QThread):
    _signal = pyqtSignal(int)
    def __init__(self):
        super(Thread, self).__init__()

    def __del__(self):
        self.wait()

    def run(self):
        for i in range(100):
            time.sleep(0.1)
            self._signal.emit(i)

class Example(QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.setWindowTitle('QProgressBar')
        self.btn = QPushButton('Click me')
        self.btn.clicked.connect(self.btnFunc)
        self.pbar = QProgressBar(self)
        self.pbar.setValue(0)
        self.resize(300, 100)
        self.vbox = QVBoxLayout()
        self.vbox.addWidget(self.pbar)
        self.vbox.addWidget(self.btn)
        self.setLayout(self.vbox)
        self.show()

    def btnFunc(self):
        self.thread = Thread()
        self.thread._signal.connect(self.signal_accept)
        self.thread.start()
        self.btn.setEnabled(False)

    def signal_accept(self, msg):
        self.pbar.setValue(int(msg))
        if self.pbar.value() == 99:
            self.pbar.setValue(0)
            self.btn.setEnabled(True)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setStyle("Fusion") ##### When the main windows loses focus, the progressbar becomes white instead of blue
    ex = Example()
    ex.show()
    sys.exit(app.exec_())

當 window 有焦點時:
在此處輸入圖像描述

當window沒有焦點時:
在此處輸入圖像描述

只要小部件的顏色角色已知,就不需要使用樣式表。

具體來說,QProgressBar 通常使用Highlight作用,它對Inactive color group有不同的顏色,所以你只需要覆蓋它。

        palette = self.pbar.palette()
        palette.setBrush(
            palette.Inactive, palette.Highlight, palette.highlight())
        self.pbar.setPalette(palette)

請注意,調色板只是一個參考,它完全取決於樣式來決定哪個組/角色用於一個小部件(或者甚至完全忽略它)。 如果您使用 Fusion 以外的其他樣式,則上述內容可能無法按預期工作。

使用 QProgressBar 的樣式表實現居中文本和 QProgressBar::chunk 以保持背景顏色,即使它失去焦點

import sys
import time
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QWidget, QPushButton, QProgressBar, QVBoxLayout, QApplication

class Thread(QThread):
    _signal = pyqtSignal(int)
    def __init__(self):
        super(Thread, self).__init__()

    def __del__(self):
        self.wait()

    def run(self):
        for i in range(100):
            time.sleep(0.1)
            self._signal.emit(i)

class Example(QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.setWindowTitle('QProgressBar')
        self.btn = QPushButton('Click me')
        self.btn.clicked.connect(self.btnFunc)
        self.pbar = QProgressBar(self)
        self.pbar.setValue(0)
        # setting background color
        self.pbar.setStyleSheet(
                         "QProgressBar"
                          "{"
                          "text-align:center;"
                          "}"
                          "QProgressBar::chunk"
                          "{"
                          "background-color : blue;"
                          "text-align:center;"
                          "color : #E0E0E0;"
                          "border : 1px"
                          "}"
                         )
        self.resize(300, 100)
        self.vbox = QVBoxLayout()
        self.vbox.addWidget(self.pbar)
        self.vbox.addWidget(self.btn)
        self.setLayout(self.vbox)
        self.show()

    def btnFunc(self):
        self.thread = Thread()
        self.thread._signal.connect(self.signal_accept)
        self.thread.start()
        self.btn.setEnabled(False)

    def signal_accept(self, msg):
        self.pbar.setValue(int(msg))
        if self.pbar.value() == 99:
            self.pbar.setValue(0)
            self.btn.setEnabled(True)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setStyle("Fusion") ##### When the main windows loses focus, the progressbar becomes white instead of blue
    ex = Example()
    ex.show()
    sys.exit(app.exec_())

暫無
暫無

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

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