PyQt5: изменить макет для нескольких объектов одновременно - PullRequest
0 голосов
/ 09 марта 2019

Хорошо, у меня есть объект QMainWindow, который является моим окном и содержит несколько объектов QLineEdit. В зависимости от условия, один объект QLineEdit может изменить свой цвет (цвет: красный, если ошибка). Я пытаюсь найти способ восстановить цвет всех объектов QLineEdit обратно в черный (по умолчанию) при нажатии кнопки. Прямо сейчас я собираю их все в один список и перебираю их, что неэффективно, потому что у меня ~ 60 объектов QLineEdit.

Я ищу способ изменения таблицы стилей глобально для всех объектов QLineEdit в моем окне, сразу.

Ui_MainWindow - это класс, который автоматически генерируется Qt Designer и импортируется. Я делаю все изменения в своем классе MainWindow, а не Ui_MainWindow, как мне подсказывает Qt Desginer.

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)')

1 Ответ

0 голосов
/ 09 марта 2019

Вы можете попробовать что-то вроде этого, но я не уверен, насколько быстрее это будет.

Я изменил методы подключения на line.textChanged.connect(self.validate), хотя вы можете изменить их обратно, используя element.setProperty в validate funciton

Добавьте две верхние строки к методу __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};') в разделе проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...