, Это по крайней мере удалить отдельное определение.

тоящее время я использую PyQT, который мне очень нравится до сих пор. Тем не менее, мне нужны двусторонние привязки, и из скудной информации, которую я нашел в Интернете, это способ сделать это. Создайте PyQTProperty, присоедините получатель, установщик и сигнал (который должен вызываться всякий раз, когда значение изменяется, чтобы уведомить GUI).

from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject

class Test(QObject):

    signal = pyqtSignal()

    def getName(self):
        print("name gotten")
        return self._name

    def setName(self, name):
        print("name changed to " + name)
        self.signal.emit()
        self._name = name

    name = pyqtProperty('QString', fget= getName, fset= setName, notify= signal)

    def __init__(self, parent=None):
        super().__init__(parent)

        # Initialise the value of the properties.
        self._name = 'asdf'

Это работает как ожидалось. Однако я не уверен, правильно ли я его использую, но для меня это выглядит совершенно ужасно. На самом деле пахнет так плохо, что я склонен открывать окно. Вместо того, чтобы просто объявлять атрибут, мне теперь нужно создать установщик и получатель (еще до объявления, то есть объявления будут в середине исходного файла) и сигнал для каждого атрибута. Это приводит к большому количеству дублирующегося кода и нечитаемых исходных файлов.

Что было бы лучшим способом изменить это на одну или две строки? Например, через автоматическую генерацию кода, метапрограммирование или макросы (я смотрел на MacroPy, но не был уверен, что это будет путь). Так что-то вроде этого:

name = # magic Python voodoo, automatically handling setters, getters and the signal

Заранее спасибо, и, пожалуйста, дайте мне знать, если мне нужно предоставить дополнительную информацию.

Изменить: Благодаря BrenBarn я заметил, что забыл упомянуть, как этот код на самом деле вызывается. Графический интерфейс реализован в QML (Qt Markup Language), и этот объект становится известным QML путем его регистрации (например,Вот, qmlRegisterType), после чего QML может создавать экземпляры и манипулировать их экземплярами. Я решил не включать полный пример исходного кода для краткости, и потому что меня в основном интересует лучший способ обработки getter / setter и создания экземпляра сигнала, не фокусируясь на QML.

Ответы на вопрос(1)

Ваш ответ на вопрос