【问题标题】:PyQt5: Change layout for multiple objects at oncePyQt5:一次更改多个对象的布局
【发布时间】:2019-03-09 08:08:55
【问题描述】:

好的,所以我有一个 QMainWindow 对象,它是我的窗口,它包含几个 QLineEdit 对象。根据条件,单个 QLineEdit 对象可以更改其颜色(颜色:如果错误则为红色)。我正在尝试找到一种方法,在按下按钮时将 all QLineEdit 对象的颜色重置为黑色(默认)。现在,我将它们全部放在一个列表中并遍历它们,这是低效的,因为我有大约 60 个 QLineEdit 对象。

我正在寻找一种方法来一次性为我的窗口中的所有 QLineEdit 对象全局更改样式表。

Ui_MainWindow 是一个由 Qt Designer 自动生成并导入的类。正如 Qt Desginer 告诉我的那样,我对我的类 MainWindow 进行了所有更改,而不是 Ui_MainWindow。

from PyQt5.QtWidgets import QMainWindow    
from Windows.main_window import Ui_MainWindow

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(QMainWindow, self).__init__()

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        # Input validation
        self.ui.lineEdit.textChanged.connect(lambda: self.validate(self.ui.lineEdit))
        self.ui.lineEdit_2.textChanged.connect(lambda: self.validate(self.ui.lineEdit_2))
        self.ui.lineEdit_3.textChanged.connect(lambda: self.validate(self.ui.lineEdit_3))

        # Open file button
        self.ui.pushButton_Open.clicked.connect(self.open_file_dialog)

        self.show()

    # If text meets a condition, paint it red
    def validate(self, element):
        if element.text() == 'foo':
            element.setStyleSheet('color: rgb(255,0,0)')

    def open_file_dialog(self):
       self.reset_stylesheet()
       ...

    def reset_stylesheet(self):
        ui_elements = [self.ui.lineEdit, self.ui.lineEdit_2, self.ui.lineEdit_3]
        for element in ui_elements:
            element.setStyleSheet('color: rgb(0,0,0)')

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    您可以尝试这样的方法,但我不确定它会快多少。

    我将连接方法更改为line.textChanged.connect(self.validate),尽管您可以在validate 函数中使用element.setProperty 将它们改回

    将前两行添加到__init__ 方法。

        self.setStyleSheet('QLineEdit[validated=true]{color: rgb(255,0,0)}')
        self.lineEdits = (x for x in self.centralWidget().children()
                          if isinstance(x, QLineEdit))
    
    # If text meets a condition, paint it red
    def validate(self, element):
        if element == 'foo':
            self.sender().setProperty('validated',True)
        else:
            self.sender().setProperty('validated',False)
        self.sender().setStyle(self.style())
    
    def invalidate(self, element):
        element.setProperty('validated', False)
        element.setStyle(element.style())
        return element
    
    
    def open_file_dialog(self):
       self.reset_stylesheet()
    
    
    def reset_stylesheet(self):
        tuple(map(self.invalidate, self.lineEdits))
    

    或者你可以添加

    self.setStyleSheet('QLineEdit{color:#FFF};')reset_stylesheet() 函数中

    self.setStyleSheet('QLineEdit{color:#F00};') 在验证部分。

    【讨论】:

    • 这是一个非常优雅的解决方案(根据代码应该可以工作)。但是,对我来说,我的代码因以下错误而崩溃:AttributeError: 'Ui_MainWindow' object has no attribute 'setStyleSheet'。我会考虑解决这个问题,但你的解决方案应该有效。除此之外,我从来不知道 self.sender(),这太棒了,会让我的代码更干净。谢谢你。 – Mark Osipov 11 分钟前 删除
    • 稍作修改后,您的代码完美运行!谢谢您的帮助。我将此标记为答案。修改:而不是你为 self.lineEdits 提出的解决方案,我选择了这个:lineEdits = self.findChildren(QLineEdit)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 2020-11-11
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多