PyQt:更新样式表而不会丢失原始样式

时间:2018-05-29 22:24:14

标签: qt pyqt format pyqt5 stylesheet

我正在创建具有某种样式的qpushbuttons,然后更新样式表以便稍后为它们着色。但是,当我这样做时,它会覆盖原始样式。有没有办法可以更新或附加到对象的样式表而不会丢失它或者不得不重新定义所有内容?

import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QLabel, QGridLayout,QPushButton, QMenu, QApplication, QWidget, QInputDialog, QLineEdit
from PyQt5.QtCore import QSize, QCoreApplication, Qt, QLine, QPoint
from PyQt5.QtGui import QPainter, QPen, QFont,QPainter, QPainterPath, QPixmap


class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setMinimumSize(QSize(400, 400))   

        color = QPushButton('color', self)
        color.clicked.connect(self.color)
        color.resize(100,115)
        color.move(0, 100)

        buttons= ['button1','button2','button3']
        self.pybutton = {}
        x=0
        t = 0
        for i in buttons:
            t = t + 100
            x+=1
            self.pybutton[str(x)] = QPushButton(i, self) 
            self.pybutton[str(x)].setObjectName('btn' + str(x))
            self.pybutton[str(x)].resize(100,100)
            self.pybutton[str(x)].move(400-int(t),100)
            self.pybutton[str(x)].setStyleSheet('QPushButton {max-width: 75px;text-align:center;padding-left: 20px; max-height: 60px; font-size: 20px;}')
        self.statusBar()
    def status(self):
        sender = self.sender()
        print('PyQt5 button click')
        self.statusBar().showMessage(sender.text() + ' was pressed')

    def color(self):
        for i in self.pybutton:
            self.pybutton[str(i)].objectName()
            if self.pybutton[str(i)].objectName() == 'btn1':
                self.pybutton[str(i)].setStyleSheet("background-color: green")
            else:
                self.pybutton[str(i)].setStyleSheet("background-color: red")    

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    mainWin = MainWindow()
    mainWin.show()
    sys.exit( app.exec_() )

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案是使用styleSheet()方法设置样式表,然后分析文本并根据需要进行修改,但这可能非常困难。另一个更好的解决方案是使用QSS Property Selector并通过修改属性来选择颜色:

import sys
from PyQt5.QtWidgets import QMainWindow,QPushButton, QApplication
from PyQt5.QtCore import QSize


class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setMinimumSize(QSize(400, 400))   

        color = QPushButton('color', self)
        color.clicked.connect(self.color)
        color.resize(100,115)
        color.move(0, 100)

        buttons= ['button1','button2','button3']
        self.pybutton = {}

        qss = """
        QPushButton{
            max-width: 75px;
            text-align:center;
            padding-left: 20px; 
            max-height: 60px; 
            font-size: 20px;
        }
        QPushButton[color = "0"]{
            background-color: green;
        }
        QPushButton[color = "1"]{
            background-color: red;
        }
        """

        for i, text in enumerate(buttons):
            btn = QPushButton(text, self) 
            btn.setObjectName('btn{}'.format(i))
            btn.setGeometry(300-i*100, 100, 100,100)
            btn.setStyleSheet(qss)
            self.pybutton[str(i)] = btn

    def color(self):
        for i, btn in self.pybutton.items():
            if btn.objectName() == 'btn1':
                btn.setProperty("color", "0")
            else:
                btn.setProperty("color", "1") 
            btn.style().polish(btn)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWin = MainWindow()
    mainWin.show()
    sys.exit( app.exec_() )