PyQt5 QWidget在@classmethod中调用时未显示

时间:2019-03-16 21:58:28

标签: python python-3.x pyqt pyqt5

我想在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 个答案:

答案 0 :(得分:1)

将此方法放在FormDialog类中以查看实际发生的情况

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

from_gui方法返回时,formDialog被破坏。

您可以使用:

解决它
  1. 在from_gui之外返回表单,因此它可以不在from_gui范围内

  2. 使FormDialog继承QDialog而不是QWidget并使用exec代替show,这样对话框将显示并阻止,对话框销毁后将执行下一条指令