Python 从主窗口派生的窗口不';关闭时不能完全关闭

Python 从主窗口派生的窗口不';关闭时不能完全关闭,python,multithreading,pyqt5,qmainwindow,qdialog,Python,Multithreading,Pyqt5,Qmainwindow,Qdialog,我有一个主窗口,当按下按钮时,它会创建第二个窗口。我有两个问题,但现在我将集中在第一个问题上:我无法让它在关闭旧窗口时完全关闭它。它以可视方式关闭窗口,但窗口仍在后台运行。为了说明这一点,我放了一个柜台。下面是说明此问题的通用代码 这是我的对话框窗口: from PyQt5 import QtCore, QtGui, QtWidgets from form_test import Ui_Form class formTest(QtWidgets.QWidget, Ui_Form): d

我有一个主窗口,当按下按钮时,它会创建第二个窗口。我有两个问题,但现在我将集中在第一个问题上:我无法让它在关闭旧窗口时完全关闭它。它以可视方式关闭窗口,但窗口仍在后台运行。为了说明这一点,我放了一个柜台。下面是说明此问题的通用代码

这是我的对话框窗口:

from PyQt5 import QtCore, QtGui, QtWidgets
from form_test import Ui_Form

class formTest(QtWidgets.QWidget, Ui_Form):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        flags = QtCore.Qt.Drawer | QtCore.Qt.WindowStaysOnTopHint 
        self.setWindowFlags(flags)
        self.setupUi(self) 

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(507, 305)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.btnOpenForm = QtWidgets.QPushButton(self.centralwidget)
        self.btnOpenForm.setGeometry(QtCore.QRect(170, 30, 93, 28))
        self.btnCloseForm = QtWidgets.QPushButton(self.centralwidget)
        self.btnCloseForm.setGeometry(QtCore.QRect(170, 160, 93, 28))
        MainWindow.setCentralWidget(self.centralwidget)

        self.btnOpenForm.clicked.connect(self.openClicked)
        self.btnCloseForm.clicked.connect(self.closeClicked)


        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.btnOpenForm.setText(_translate("MainWindow", "Open Form"))
        self.btnCloseForm.setText(_translate("MainWindow", "Close Form"))

    def openClicked(self):
        print('open')
        self.popForm = formTest()
        self.popForm.show()

    def closeClicked(self):
        print('close')
        self.popForm.close()


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
这是我的生成windows代码(form_test.py):

当我关闭第二个窗口时,它仍在内存中运行。当我再次尝试打开它时,另一个开始运行,然后我有两个运行。我是否应该使用另一个窗口,当它关闭时,它会破坏所有内存?我遇到的第二个问题是,当我尝试第二次启动时,我的实际代码(不是这个通用代码)会导致崩溃。这个问题可能会随着这个问题的解决而消失,因为我不能在线共享我的代码,所以我现在必须尽可能地保持通用性,所以我希望先解决这个问题,也许也能得到解决


请帮忙。。。我在这方面工作的时间太长了!!!提前感谢您在这方面提供的任何帮助。

不幸的是,您提供的代码不接近可测试性。Qt对话框关闭时不会从内存中删除。还有一个叫做“删除”的概念,它实际上会破坏对话框的资源。你说当你“试图再次打开它”时,应用程序崩溃了,但我看不出你曾经这样做过:每次单击“打开”按钮时,你都会创建一个全新的对话框。您还使用多重继承,但Quall实际上是在C++库类的顶部构建的。这是你想要的方式吗?“in-closeEvent”是否打印过?是否有一种替代窗口类型,我应该使用它来代替关闭时会删除所有内存的Qt对话框?为了回答你的问题。。。是的,打印语句“in closeEvent”确实有效,因为我正在从主窗口生成此对话框。希望这将有助于演示此问题。。。我将上面的代码更改为非常通用的代码,但仍然说明了问题。为什么要将其从内存中删除?因为在实际应用程序中,它与外部应用程序建立连接。我们不希望它创建到同一应用程序的多个连接。我们还要确保当它断开连接时,它是完全断开的。这成为一个安全问题。我们可以做所有的插座断开等等(我们做的)。。。但这个应用程序可能在重启之间连续运行数周。在此期间,我们生成的窗口可以打开/关闭数百次。我们不想无缘无故地在背景中出现数百个“死”的断开连接的片段。
from PyQt5 import QtCore, QtGui, QtWidgets
import time, threading

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(400, 300)
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(190, 170, 93, 28))
        self.pushButton.setObjectName("pushButton")

        self.pushButton.clicked.connect(self.pushButtonClicked)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

        self.loopThread = threading.Thread(target = self.looping)
        self.loopThread.daemon = True
        self.loopThread.start()

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.pushButton.setText(_translate("Form", "PushButton"))

    def pushButtonClicked(self):
        print("clicked")

    def looping(self):
        count = 0
        while(True):
            print('looping... ' + str(count))
            count = count + 1
            time.sleep(1)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())