2015-12-01 2 views
0

Рассмотрим У меня есть класс с такой структурой (CustomClass может/не может быть на вершине иерархии):PySide получить родитель QObject в любом месте в иерархии

CustomClass 

.. QTabWidget 

.... QWidget 

...... QTreeView 

В QTreeView У меня есть функция, пытаясь вернуться к CustomClass. Прямо сейчас, чтобы сделать это, мне нужно сделать: self.parent().parent().parent().

Хотя это работает, он просто чувствует себя очень неряшливо, и если мне когда-либо понадобится изменить структуру, это не удастся. Есть ли другой способ получить CustomClass? Обычно я бы передал экземпляр его во время своего конструктора, который я могу назвать напрямую, но задаюсь вопросом, что лучше всего подходит для этого.

ответ

0

Это чувствует себя как порядочный процедурным способом, чтобы получить его:

customClassInst = self.parent() 
while customClassInst is not None and type(customClassInst) != CustomClass: 
    customClassInst = customClassInst.parent() 

Любые другие ответы по-прежнему приветствуются :)

+1

Если вы хотите, чтобы найти родителя 'CustomClass' то это своего рода, как это сделать (хотя вы, вероятно, должны использовать 'isinstance()', а не 'type() =='). Но заголовок вопроса заставляет звучать так, как будто вы хотите, чтобы виджет верхнего уровня был или нет, это «CustomClass», на который отвечает «window()». – strubbly

+0

Спасибо, в этом случае 'window()' именно то, что мне нужно. :) –

+0

Не уверен, что я должен ответить на этот вопрос? Думаю, я просто буду держать вещи в чистоте ... – strubbly

1

Названное вопрос приводит к очень прямой ответ. Метод window() на QWidget возвращает виджет предка, который (или может иметь) оконный системный фрейм: обычно это виджет «верхнего уровня», который вы хотите найти. Документы дают изменения заголовка окна в качестве канонического варианта использования:

self.window().setWindowTitle(newTitle) 

возвращает self если Qwidget является самим окном.

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

customClassInst = self.parent() 
while customClassInst is not None and not isinstance(customClassInst,CustomClass): 
    customClassInst = customClassInst.parent() 

Обратите внимание, что обычно вы должны использовать isinstance, а не type() ==, потому что прежний корректно обрабатывает подклассы.

отметить также, что этот код будет возвращать None если нет CustomClass не найден, который может или не может быть то, что вы хотите ...

+0

Интересно отметить: я называл 'window()', и он работал очень хорошо. Затем я начал использовать 'QDockWidget' и заметил, когда док плавает и стыкуется,' window() 'будет возвращать разные результаты. –

+0

Да, хорошая точка. Это дает вам «окно», которое является парнем наверху с фреймом, а не логическим «верхом» иерархии. – strubbly

+0

Слишком плохо, так как это было очень чистое решение. Еще хороший ответ, хотя если вы не используете 'QDockWidget' –

Смежные вопросы