Получение и установка значений виджетов PyQT, которые были созданы динамически

Я довольно новичок в PyQT и борюсь с программно созданными макетами. Я пытаюсь создать страницу настроек для своего приложения, которая берет список настроек словаря и автоматически создает настраиваемый список настроек. Проблема, с которой я сталкиваюсь, заключается в том, какой лучший способ получить и установить значение виджета, если класс виджета может быть любым. Например, при загрузке программы ей нужно будет извлечь последнюю конфигурацию для настроек и загрузить ее при создании страницы настроек. Если у вас есть QTextEdit и QCheckBox, методы, которые вы будете использовать для этого, будут другими (setChecked для флажка и setText для текстового поля). У меня есть полуфункциональный скрипт, но он кажется крайне запутанным, и я хочу узнать, есть ли лучший способ.

Из того, что мне удалось придумать на данный момент, это выглядит так

Словарь настроек выглядит так:

code, который строит макет, выглядит так:

Я добавил несколько вспомогательных функций, чтобы попытаться заставить это работать. Я создал словарь строк, который сопоставляет тип виджета с методом, и использовал getattr(), чтобы попытаться создать функции, которые работают как универсальные геттеры и сеттеры для любого виджета на основе переданного типа, но это станет громоздким, если мне придется вручную делать это для каждого типа виджета (я сделал только два ниже для тестирования).

Знаете ли вы какой-либо лучший способ справиться с этим? Учитывая, что я новичок в PyQT, возможно, я упускаю встроенный способ сделать это, но я искал документацию и не понял, как это можно сделать.

settings = {
     'name' : {'value' : 'test', 'control' : QLabel(), 'label' : 'Name'},
     'enabled' : {'value' : True, 'control' : QCheckBox(), 'label' : 'Enabled'}
}
    def build_settings(settings):
        widget = QWidget()
        layout = QVBoxLayout()

        for key, setting in settings.items():
            display = QHBoxLayout()
            display.addWidget(QLabel(setting['label']))
            control = setting['control']
            control = set_widget_value(control, setting['value'])
            signal = widget_listener(control)
            if signal != 'null':
                signal.connect(update_settings(key, get_widget_value(control)))
            
            display.addWidget(control)
            layout.addLayout(display)

        widget.setLayout(layout)
        return widget
QtWidgets = {
    'QCheckBox' : {'update' : 'setChecked', 'signal' : 'stateChanged', 'value': 'checkState'},
    'QLabel' : {'update' : 'setText', 'signal' : 'null', 'value': 'text'},
}

def set_widget_value(widget, value):
    update = QtWidgets[widget.__class__.__name__]['update']
    if update != 'null':
        set = getattr(widget, update)
        set(value)
        return widget
    else:
        return 'null'

def get_widget_value(widget):
    value = QtWidgets[widget.__class__.__name__]['value']
    if value != 'null':
        value = getattr(widget, value)
        return value
    else:
        return 'null'

def widget_listener(widget):   
    signal = QtWidgets[widget.__class__.__name__]['signal']
    if signal != 'null':
        listener = getattr(widget, signal)
        return listener
    else:
        return 'null'
Анастасия
Вопрос задан21 марта 2024 г.

1 Ответ

Ваш ответ

Загрузить файл.