python - Background 在 qthread 之后更改样式表时消失

在使用 PySide6 库制作了几个 interfaces 之后,我一直遇到这个问题,在程序经过 qthread 进程后调用 setStyleSheet 语句时,我初始化的自定义 background 变黑。

这就是我初始化 background 的方式:

background = QPixmap("Data\\background.png")
palette = QPalette()
palette.setBrush(QPalette.Window, background)
self.show()
self.setPalette(palette)

这就是我制作 qthread 的方式:

class Signaller(QObject):
    progress = Signal(int)
    finished = Signal()

class Generate(QThread):
    def __init__(self):
        QThread.__init__(self)
        self.signaller = Signaller()
    
    def run(self):
        self.signaller.progress.emit(0)
        #do stuff
        self.signaller.progress.emit(1)
        self.signaller.finished.emit()

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

    def initUI(self):
        self.setEnabled(False)
        QApplication.processEvents()
        
        self.progressBar = QProgressDialog("Generating...", None, 0, 1, self)
        self.progressBar.setWindowTitle("Status")
        self.progressBar.setWindowModality(Qt.WindowModal)
        
        self.worker = Generate()
        self.worker.signaller.progress.connect(self.set_progress)
        self.worker.signaller.finished.connect(self.patch_finished)
        self.worker.start()
    
    def set_progress(self, progress):
        self.progressBar.setValue(progress)
    
    def patch_finished(self):
        box = QMessageBox(self)
        box.setWindowTitle("Done")
        box.setText("Mod generated !")
        box.exec()
        self.setEnabled(True)

然而,在程序通过 qthread 至少一次后调用此语句会删除 background:

self.seed_field.setStyleSheet("color: #ffffff")

如果 qthread 没有事先触发,它就不会发生

这是一个完整的工作示例:

from PySide6.QtCore import *
from PySide6.QtGui import *
from PySide6.QtWidgets import *
import sys

class Signaller(QObject):
    progress = Signal(int)
    finished = Signal()

class Generate(QThread):
    def __init__(self):
        QThread.__init__(self)
        self.signaller = Signaller()
    
    def run(self):
        self.signaller.progress.emit(0)
        #do stuff
        self.signaller.progress.emit(1)
        self.signaller.finished.emit()

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

    def initUI(self):
        self.setStyleSheet("QWidget{background:transparent; color: #ffffff; font-family: Cambria; font-size: 18px}"
        + "QMessageBox{background-color: #1d1d1d}"
        + "QDialog{background-color: #1d1d1d}"
        + "QProgressDialog{background-color: #1d1d1d}"
        + "QPushButton{background-color: #1d1d1d}"
        + "QSpinBox{background-color: #1d1d1d}"
        + "QLineEdit{background-color: #1d1d1d}"
        + "QLineEdit[text=\"\"]{color: #666666}"
        + "QMenu{background-color: #1d1d1d}"
        + "QToolTip{border: 0px; background-color: #1d1d1d; color: #ffffff; font-family: Cambria; font-size: 18px}")
        
        grid = QGridLayout()
        grid.setSpacing(10)
        
        box_1_grid = QGridLayout()
        self.box_1 = QGroupBox("Test")
        self.box_1.setLayout(box_1_grid)
        grid.addWidget(self.box_1, 0, 0, 1, 1)
        
        button_1 = QPushButton("QThread")
        button_1.clicked.connect(self.button_1_pressed)
        box_1_grid.addWidget(button_1, 0, 0)
        
        button_2 = QPushButton("StyleSheet")
        button_2.clicked.connect(self.button_2_pressed)
        box_1_grid.addWidget(button_2, 0, 1)
        
        self.setLayout(grid)
        self.setFixedSize(1280, 720)
        
        background = QPixmap("background.png")
        palette = QPalette()
        palette.setBrush(QPalette.Window, background)
        self.show()
        self.setPalette(palette)
        
        center = QScreen.availableGeometry(QApplication.primaryScreen()).center()
        geo = self.frameGeometry()
        geo.moveCenter(center)
        self.move(geo.topLeft())
        
        QApplication.processEvents()
    
    def button_1_pressed(self):
        self.setEnabled(False)
        QApplication.processEvents()
        
        self.progressBar = QProgressDialog("Generating...", None, 0, 1, self)
        self.progressBar.setWindowTitle("Status")
        self.progressBar.setWindowModality(Qt.WindowModal)
        
        self.worker = Generate()
        self.worker.signaller.progress.connect(self.set_progress)
        self.worker.signaller.finished.connect(self.patch_finished)
        self.worker.start()
    
    def button_2_pressed(self):
        self.box_1.setStyleSheet("color: #ffffff")
    
    def set_progress(self, progress):
        self.progressBar.setValue(progress)
    
    def patch_finished(self):
        box = QMessageBox(self)
        box.setWindowTitle("Done")
        box.setText("QThread done")
        box.exec()
        self.setEnabled(True)

def main():
    app = QApplication(sys.argv)
    main = Main()
    sys.exit(app.exec())

if __name__ == '__main__':
    main()

回答1

我有一个类似的问题,我通过设置 background 而不是像素来解决它,而是使用 some_object.setStyleSheet(background: url("some/url")

相似文章

shopify - 使 css 元素可点击

我在Shopify中有一个store区域,其中包含CSS元素我想让它们可点击这是我的CSS代码我尝试了这里写的各种技巧但我没有成功这是我的store我很想得到解决办法我想让它们可点击这是我的CSS代码...

随机推荐

最新文章