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_())