PyQt5 динамически меняет тему / палитру приложения - PullRequest
0 голосов
/ 12 сентября 2018

Я могу успешно создать новую палитру и установить ее в QApplication при запуске. Однако после запуска приложения я не могу больше менять цвета палитры. Я хотел бы изменить цвета кнопок, если пользователь выбирает конкретную тему. Текущий код, который работает при запуске, но не позднее, выглядит следующим образом:

palette = QtGui.QPalette()
palette.setColor(QtGui.QPalette.Window, QtGui.QColor(3, 18, 14))
palette.setColor(QtGui.QPalette.Base, QtGui.QColor(15, 15, 15))
palette.setColor(QtGui.QPalette.AlternateBase, QtGui.QColor(53, 53, 53))
palette.setColor(QtGui.QPalette.ToolTipBase, QtCore.Qt.white)
palette.setColor(QtGui.QPalette.Text, QtCore.Qt.white)
palette.setColor(QtGui.QPalette.Button, QtGui.QColor(53, 53, 53))
palette.setColor(QtGui.QPalette.ButtonText, QtCore.Qt.white)
palette.setColor(QtGui.QPalette.BrightText, QtCore.Qt.red)
palette.setColor(QtGui.QPalette.Highlight, QtGui.QColor(142, 45, 197).lighter())
palette.setColor(QtGui.QPalette.HighlightedText, QtCore.Qt.black)
app.setPalette(palette)

Тот же объект палитры, если он используется в слоте, не меняет цвет. Например, код в слоте:

palette.setColor(QtGui.QPalette.Button, QtGui.QColor(53, 53, 53))
app.setPalette(palette)

Может кто-нибудь, пожалуйста, дайте мне знать, что мне здесь не хватает? Спасибо.

Edit: Я только что узнал, что он изменил только некоторые области. Например, в слоте, который я написал, он меняет цвет подсветки, но не цвет QTab (который был установлен путем установки цвета на кнопку). Мой текущий код слота:

def change_theme(self): 
    pal = QtWidgets.QApplication.palette() 
    #The next line works 
    pal.setColor(QtGui.QPalette.Highlight, QtGui.QColor(0, 0, 128)) 
    #The next line doesnt work. Expected it to change the Tab Widget color 
    #using this line. 
    pal.setColor(QtGui.QPalette.Button, QtGui.QColor(62, 80, 91)) 
    QtWidgets.QApplication.setPalette(pal)

1 Ответ

0 голосов
/ 03 июня 2019

Попробуйте установить app.setStyle('Fusion')

from PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton, QApplication
from PyQt5.QtGui import QPalette, QColor

class Window(QWidget):

    def __init__(self):
        super().__init__()
        self.flag = False

        self.button = QPushButton('change the colors of the buttons', self)
        self.button.clicked.connect(self.click)
        lay = QVBoxLayout(self)
        lay.addWidget(self.button)

        self.palette = self.palette()
        self.palette.setColor(QPalette.Window, QColor(3, 18, 14))

        self.palette.setColor(QPalette.Button, QColor('red'))  

        self.setPalette(self.palette)

    def click(self):
        print("click")
        if not self.flag:
            self.palette.setColor(QPalette.Button, QColor(62, 80, 91))
        else: 
            self.palette.setColor(QPalette.Button, QColor(0, 0, 128))

        self.setPalette(self.palette)
        self.flag = not self.flag


if __name__ == '__main__':
    import sys
    app = QApplication([])

    app.setStyle('Fusion')                              # <-----

    w = Window()
    w.show()
    sys.exit(app.exec_())

enter image description here

...