PyQt5 QWidget не отображается при вызове в @classmethod

#python #python-3.x #pyqt #pyqt5

#python #python-3.x #pyqt #pyqt5

Вопрос:

Я хочу вызвать a QWidget() внутри a @classmethod , чтобы получить параметры для класса из формы Qt:

 from PyQt5.QtWidgets import QWidget, QApplication
import sys


class FormDialog(QWidget):

    def __init__(self):
        QWidget.__init__(self)
        super(FormDialog, self).__init__()

        print("FormDialog called")


class Files(object):

    def __init__(self):
        pass

    @classmethod
    def from_gui(cls):
        form = FormDialog()
        form.show()

        return cls()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    obj = Files.from_gui()  # "FormDialog called" appears, but window doesn't show up

    form = FormDialog()  # "FormDialog called" appears
    form.show()  # Window appears

    sys.exit(app.exec_())
  

Если я вызываю FormDialog() внутри @classmethod , окно не отображается. Если я вызываю его вне @classmethod , все работает так, как задумано. Почему?

Ответ №1:

Поместите этот метод в класс FormDialog, чтобы увидеть, что происходит на самом деле

 def __del__(self):
    print('Deleting the form')
  

formDialog уничтожается при возврате метода from_gui.

Вы можете решить это с помощью :

  1. возвращает форму за пределы from_gui, чтобы она могла находиться вне области from_gui

  2. Сделайте FormDialog наследующим QDialog вместо QWidget и используйте exec вместо show, таким образом, диалоговое окно отображается и блокируется, следующая инструкция будет выполнена после того, как диалоговое окно будет уничтожено