PyQt5动态更改应用程序主题/调色板

时间:2018-09-12 06:19:45

标签: python python-3.x pyqt pyqt4 pyqt5

我可以成功创建一个新的调色板,并在启动时将其设置为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)

有人可以让我知道我在这里想念的吗? 谢谢。

编辑: 我只是发现它仅修改了一些区域。例如,在我编写的插槽中,它将更改突出显示颜色,但不会更改QTab颜色(通过将颜色设置为Button来设置)。我当前的广告位代码:

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)

2 个答案:

答案 0 :(得分:0)

我不理解您的问题的哪一部分,在下面的示例中,我演示了如何在创建窗口后每秒更改调色板:

import sys
import random
from PyQt5 import QtCore, QtGui, QtWidgets


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        lay = QtWidgets.QVBoxLayout(self)

        for obj in (QtWidgets.QPushButton("click me"), 
                    QtWidgets.QRadioButton("hello world"), 
                    QtWidgets.QCheckBox("checkbox"),
                    QtWidgets.QSpinBox()):
            lay.addWidget(obj)

        timer = QtCore.QTimer(self)
        timer.timeout.connect(self.on_timeout)
        timer.start(1000)

    @QtCore.pyqtSlot()
    def on_timeout(self):
        pal = QtWidgets.QApplication.palette()
        color = QtGui.QColor(*random.sample(range(256), 3))
        pal.setColor(QtGui.QPalette.Button, color)
        QtWidgets.QApplication.setPalette(pal)

def create_palette():
    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)
    return palette

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    QtWidgets.QApplication.setPalette(create_palette())

    w = Widget()
    w.show()

    sys.exit(app.exec_())

答案 1 :(得分:0)

尝试设置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