Я испытывал головную боль, пытаясь работать с пристыкованными панелями Nuke. Он работает с QStackedWidgets
как вкладки, где вся программа построена из него и очень динамична.
Просто для записи, с которой я имел дело, вроде этого, она работает, но для выяснения требуется куча проб и ошибок:
def x(self):
return self.parent().parent().parent().parent().parent().parent().parent().x()
def y(self):
return self.parent().parent().parent().parent().parent().parent().parent().y()
def closeEvent(self, event):
is_docked = self.x() == self.y() == 0
num_tabs = widget.parent().parent().parent().parent().parent().parent().parent().parent().count()
#Delete the window
if not is_docked and num_tabs == 1:
self.parent().parent().parent().parent().parent().parent().parent().parent().parent().close()
#Delete the tab
else:
for obj in QtWidgets.QApplication.allWidgets():
if obj.objectName() == 'uk.co.thefoundry.NukeTestWindow':
obj.deleteLater()
event.accept()
Я попытался получить полный контроль, чтобы потом иметь дело с обратными вызовами, что было немного сложно, так как никогда не вызывает closeEvent
. В настоящее время я могу обрабатывать автоматическое закрытие его, и я буду использовать hideEvent
для чтения положения окна, так как оно вызывает непосредственно перед тем, как оно закрывается.
У меня есть почти всех необходимых мне функций, но я все еще не могу поймать, когда пользователь вручную закрывает вкладку. Я технически выяснил, как определить, закрыто ли оно, но оно работает только после , когда функция завершена.
Если я распечатываю значение self.parent().parent().parent().parent().parent().parent().parent().parent()
, оно говорит, что это виджет, но если я печатаю после выполнения кода, то оно равняется None
, так что это идеальный уровень проверки родителей.
Как запросить это в hideEvent
, но сместить выполнение до тех пор, пока все не закончится? Насколько я знаю, после этого не вызывается никаких других событий, я рассмотрел работу с потоками с time.sleep
, но он не очень чистый и может привести к проблемам.
У Майи была команда под названием evalDeferred
, которая была очень полезна в подобных случаях. У меня только что был быстрый тест с nukescripts.utils.executeDeferred
, но даже со сном на секунду это не сработало.