Задать вопрос
1na1
@1na1
Hello, world!

Как в связать объекты в PyQt?

Всем привет!

Я разрабатываю форму с использованием PyQt. Мне не совсем понятно как объекты связываются между собой.

Пример: У меня есть QLineEdit и QCheckBox. При изменении статуса QCheckBox сигнализирует об этом и QLineEdit становится доступным или недоступным для ввода.

Сейчас я использую вот такую конструкцию:

self.MyChkbox.stateChanged.connect(
    lambda state: self.MyLineEdit.setReadOnly(
        True if state == 2 else False
    )
)


Но так невозможно, например, прохождение в цикле по всем чекбоксам, чтобы законнектить каждый со "своим" лайнЕдитом и для коннекта ста чекбоксов мне сто раз придется повторить эту конструкцию, каждый раз явно указывая на новое поле.
В моем представлении должно быть можно как-то группировать виджеты, чтобы каждому чекбоксу можно было дать команду изменять состояние своего виджета.

Вопрос: как мне избежать явного указания имен или ссылок на объекты в коде? Существует ли какая-то группировка виджетов, реализующая их связь за меня? Что читать?
  • Вопрос задан
  • 716 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 1
@dndred
class MyCheckBox(QCheckBox):
    def __init__(self, target_edit:QLineEdit, parent):
        super().__init__(parent)
        self._target_edit = target_edit
        self.stateChanged.connect(self._stateChanged_slot)

    def _stateChanged_slot(self):
        self._target_edit.setReadOnly(not self._target_edit.isReadOnly())
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
1na1
@1na1 Автор вопроса
Hello, world!
Пока удалось решить через назначение кастомного атрибута (свойства) в каждом чекбоксе. Атрибут указывает на имя поля, которое относится к этому чекбоксу.

Во время конструирования формы задаю атрибуты так:

self.MyChkbox.setProperty('field_name', 'MyLineEdit')


Потом при инициализации окна делаю так:

for checkbox in self.findChildren(QCheckBox): # Для всех чекбоксов формы
    if checkbox.property('field_name'): # Если чекбокс имеет свойство 'field_name'
        checkbox.stateChanged.connect( # Законнектить смену статуса чекбокса к функции
            # Функция поиска поля по имени объекта, содержащегося в свойстве отправителя (чекбокса)
            lambda state : self.findChild(QLineEdit, self.sender().property('field_name')).setReadOnly( 
                True if state == 2 else False # Выставить соответствующий статус доступности для ввода
            )
        )


Буду очень рад любым другим предложениям. Особенно ссылке на чтиво.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы