Доступ к родительскому классу из Qt-производных объектов - PullRequest
0 голосов
/ 29 марта 2020

В Qt часто необходимо создавать пользовательские объекты. Например, class myQLabel(QLabel):. Скорее всего, вы также передадите родительский элемент QObject его конструктору и зададите его в базовом классе следующим образом:

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

Учитывая ситуацию, такую ​​как:

class foo(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        my_bar = bar(self)

    def baz():
        print("bazzed")

Is в my_bar целесообразно вызывать функцию baz, вызывая super().parent().baz().

. Или всегда предпочитать откладывать сигналы и слоты. Напрашивается следующий вопрос: разве это не основано на Qt, будет ли использование родителя таким способом для вызова членов родительского класса?

1 Ответ

0 голосов
/ 29 марта 2020

Похоже, вы путаете родство между классом (наследование) и иерархией между объектами QObject. В вашем случае экземпляр "foo", то есть "self", является родителем экземпляра "my_bar", но "foo" не является родителем класса "bar".

Наследование между классами равно из основных характеристик в OOP, что позволяет повторно использовать код, поскольку он определяет общие характеристики между классами. С другой стороны, иерархия между QObject имеет в качестве основной задачи управление памятью, то есть отсутствие утечек памяти.

С учетом вышеизложенного, super().parent().baz() не имеет смысла, так как в этом случае super().parent() то же самое, что и self.parent(), так как метод получения не переопределен, но вы должны использовать self.parent().baz().


Теперь проблема проектирования атакована: если вы используете "self.parent (). baz () «тогда вы заставляете, чтобы любой экземпляр« bar »всегда имел« foo »в качестве родителя, и что произойдет, если для некоторой реализации экземпляр« bar »не обязательно будет дочерним для экземпляра« foo » ? Ну, у вас будут проблемы, так как с вашим дизайном вы не дадите свободу. В заключение, это будет зависеть от того, будет ли ваша цель заставить любой экземпляр «bar» быть потомком экземпляра «foo».

Чтобы избежать этих проблем, Qt реализует сигналы, так как они дают нам много свободы, так как он уведомлен (или вызван), какой метод класса X.

Я рекомендую вам прочитать Сигналы и слоты , чтобы вы понимали преимущества сигналов по сравнению с другими такие элементы, как обратные вызовы, et c.

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