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

Python PyQt5动态更改应用程序主题/调色板,python,python-3.x,pyqt,pyqt4,pyqt5,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, QtGu

我可以成功地创建一个新的调色板,并在启动时将其设置为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)
如果在插槽中使用相同的调色板对象,则不会更改颜色。插槽中的Eg代码:

palette.setColor(QtGui.QPalette.Button, QtGui.QColor(53, 53, 53))
app.setPalette(palette)
有人能告诉我我错过了什么吗? 谢谢

编辑: 我刚刚发现它只修改了部分区域。例如,在我编写的插槽中,它更改了高光颜色,但没有更改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)

尝试设置
app.setStyle('Fusion')

从PyQt5.qtwidts导入QWidget、QVBoxLayout、QPushButton、QApplication
从PyQt5.QtGui导入qpalete、QColor
类窗口(QWidget):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.flag=False
self.button=QPushButton('更改按钮的颜色',self)
self.button.clicked.connect(self.click)
lay=QVBoxLayout(自身)
lay.addWidget(self.button)
self.palete=self.palete()
self.palete.setColor(qpalete.Window,QColor(3,18,14))
self.palete.setColor(qpalete.Button,QColor('red'))
self.setPalette(self.palette)
def单击(自我):
打印(“单击”)
如果不是self.flag:
self.palete.setColor(qpalete.Button,QColor(62,80,91))
其他:
self.palete.setColor(qpalete.Button,QColor(0,0,128))
self.setPalette(self.palette)
self.flag=非self.flag
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
导入系统
app=QApplication([])

app.setStyle('Fusion')#尝试设置
app.setStyle('Fusion')

从PyQt5.qtwidts导入QWidget、QVBoxLayout、QPushButton、QApplication
从PyQt5.QtGui导入qpalete、QColor
类窗口(QWidget):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.flag=False
self.button=QPushButton('更改按钮的颜色',self)
self.button.clicked.connect(self.click)
lay=QVBoxLayout(自身)
lay.addWidget(self.button)
self.palete=self.palete()
self.palete.setColor(qpalete.Window,QColor(3,18,14))
self.palete.setColor(qpalete.Button,QColor('red'))
self.setPalette(self.palette)
def单击(自我):
打印(“单击”)
如果不是self.flag:
self.palete.setColor(qpalete.Button,QColor(62,80,91))
其他:
self.palete.setColor(qpalete.Button,QColor(0,0,128))
self.setPalette(self.palette)
self.flag=非self.flag
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
导入系统
app=QApplication([])
应用程序设置样式(“融合”)#
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_())