PyQt5 QWidget не отображается при вызове в @classmethod - PullRequest
0 голосов
/ 17 марта 2019

Я хочу вызвать QWidget() в @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 Ответ

1 голос
/ 17 марта 2019

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

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

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

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

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

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

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