【问题标题】:2-second delay when changing Qpushbutton stylesheet image更改 Qpushbutton 样式表图像时延迟 2 秒
【发布时间】:2021-05-01 23:27:32
【问题描述】:

当点击按钮时,我改变了图像,就好像它被选中了......

为了做出这个改变,我让每个人都使用默认图像,只改变按下的按钮,但这 3 行会导致程序延迟 2 秒

main_app.ui.btn_tela_atividade_clique_na_imagem.setStyleSheet(style + "clique na figura off.png);}")
main_app.ui.btn_tela_atividade_clique_na_letra.setStyleSheet(style + "clique na letra que falta off.png);}")  
main_app.ui.btn_tela_atividade_digt_nome_imagem.setStyleSheet(style + "digite o nome da figura off.png);}")

这是函数的调用方式

main.py

def atv_escolhida(self, nome_atividade):    
        self.atividades.atividade_escolhida_fun(self, nome_atividade)

atividades.py

def atividade_escolhida_fun(self, main_app, nome_atividade):
        # main_app = self da classe main.py
        # self.set_atividade_escolhida(nome_atividade)
        self.atividade_escolhida = nome_atividade

        style = """
        QPushButton:hover {
            border: 2px solid rgb(0, 0, 0);
        }
        QPushButton{
            border-image: url(:/atvimg/app_imagens/"""

        # TODO verificar isso
        main_app.ui.btn_tela_atividade_clique_na_imagem.setStyleSheet(style + "clique na figura off.png);}")
        main_app.ui.btn_tela_atividade_clique_na_letra.setStyleSheet(style + "clique na letra que falta off.png);}")  
        main_app.ui.btn_tela_atividade_digt_nome_imagem.setStyleSheet(style + "digite o nome da figura off.png);}")
        
        if(nome_atividade == "tela_atividade_digt_nome_imagem"):
            main_app.ui.btn_tela_atividade_digt_nome_imagem.setStyleSheet(style + "digite o nome da figura on.png);}")
        elif(nome_atividade == "tela_atividade_clique_na_imagem"):
            main_app.ui.btn_tela_atividade_clique_na_imagem.setStyleSheet(style + "clique na figura on.png);}")
        elif(nome_atividade == "tela_atividade_clique_na_letra"):
            main_app.ui.btn_tela_atividade_clique_na_letra.setStyleSheet(style + "clique na letra que falta on.png);}")

【问题讨论】:

标签: python pyqt5 qtstylesheets


【解决方案1】:

根据QObject 的动态属性值,您可以使用具有两个(或更多)特定小部件外观的固定样式表,而不是重新分配样式表。使用widget.setProperty(propName, propValue) 更改动态属性并调用style.unpolish(widget)style.polish(widget)。这可以解决延迟问题。我使用background-color 代替图片来展示概念。请自行采纳给border-image

from PyQt5 import QtWidgets

class View(QtWidgets.QWidget):
    def __init__(self, parent = None):
        super().__init__(parent)
        layout = QtWidgets.QVBoxLayout()
        buttons = []
        for i in range(3):
            name = "button{}".format(i+1)
            button = QtWidgets.QPushButton()
            button.setObjectName(name)
            layout.addWidget(button)
            button.setProperty("selected", False)
            button.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
            button.clicked.connect(lambda on, i=i: self.setSelected(i))
            buttons.append(button)
        self._buttons = buttons
        self.setLayout(layout)
        self.setStyleSheet("""
        QPushButton:hover { border: 2px solid rgb(0, 0, 0);}
        #button1[selected="false"] {background-color: #cccccc;}
        #button2[selected="false"] {background-color: #cccccc;}
        #button3[selected="false"] {background-color: #cccccc;}

        #button1[selected="true"] {background-color: #ccccff;}
        #button2[selected="true"] {background-color: #ccffcc;}
        #button3[selected="true"] {background-color: #ffcccc;}
        """)

    def setSelected(self, i):
        style = self.style()
        for j, button in enumerate(self._buttons):
            button.setProperty("selected", i == j)
            style.unpolish(button)
            style.polish(button)

if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    view = View()
    view.show()
    app.exec()

【讨论】:

    猜你喜欢
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 2012-02-16
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多