在@classmethod中调用时,PyQt5 QWidget不会显示

问题描述 投票:0回答:1

我想在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之外调用它,一切都像预期的那样。为什么?

python python-3.x pyqt pyqt5
1个回答
1
投票

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

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

当from_gui方法返回时,将销毁formDialog。

你可以用以下方法解决它:

  1. 在from_gui之外返回表单,因此它可以在from_gui范围之外生效
  2. 使FormDialog继承QDialog而不是QWidget并使用exec而不是show,这样对话框显示和阻塞,下一条指令将在对话框被销毁后执行
© www.soinside.com 2019 - 2024. All rights reserved.