如何修复 PyQt5 小部件崩溃问题?

时间:2021-07-04 05:26:31

标签: python pyqt5 qwidget qdialog

我正在使用 Python 3.7 和 PyQt5 5.15.4 编写程序,但突然出现崩溃问题。 这是显示这种现象的简化版本。

import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QDialog, QVBoxLayout, QApplication


class WindowA(QWidget):
    def __init__(self):
        super().__init__()
        self.make_layout()

    def make_layout(self):
        vbox = QVBoxLayout()
        self.setLayout(vbox)


class LoginDialog(QDialog):
    def __init__(self):
        super().__init__()

        self.btn_login = QPushButton('Login')
        self.btn_login.clicked.connect(self.btn_login_clicked)

        vbox = QVBoxLayout()
        vbox.addWidget(self.btn_login)
        self.setLayout(vbox)

    def btn_login_clicked(self):
        self.accept()
        main_window = WindowA()
        main_window.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    login_dialog = LoginDialog()
    login_dialog.show()
    sys.exit(app.exec_())

这就是我的意图:

  1. 该程序以 LoginDialog 开始,其中包含一个登录按钮。
  2. 如果我按下按钮,就会出现 WindowA。

但是,如果我运行代码,当我按下 LoginDialog 中的登录按钮时,WindowA 会闪烁并且程序终止并且没有错误消息。

1 个答案:

答案 0 :(得分:0)

没有崩溃,两个窗口都关闭,程序运行完毕。

  • LoginDialog 关闭,因为 QDialog.accept() 导致对话框关闭。
  • WindowA 会在函数返回后立即进行垃圾回收。使用实例变量使其保持在范围内。
def btn_login_clicked(self):
    self.main_window = WindowA()
    self.main_window.show()