我正在构建一个带有主 QWidget 的解析器,该 QWidget 接受文件输入,然后打开一个新的 QWidget 并显示包含已解析数据的表格。
但是,当我从主 QWidget 中选择一个新文件时,它会替换第二个 QWidget,而不是实例化另一个 QWidget。
此外,我希望能够关闭主 QWidget 并关闭所有 QWidget 并退出程序。目前还没有这样做。
完整代码:main.py
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import QColor
from dbparser import DBParser
import xlsxwriter
class PopUp(QWidget):
def __init__(self, tablename, fields, rows):
super(PopUp, self).__init__()
#Window Property
self.title = tablename
self.left = 300
self.top = 250
self.width = 1000
self.height = 750
self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)
...
class App(QWidget):
def __init__(self):
super().__init__()
self.title = 'CMSDBParser'
self.left = 150
self.top = 150
self.width = 500
self.height = 200
self.file = ""
self.filepath = QLineEdit()
self.bigEditor = QTextEdit()
self.browse_btn = QPushButton('Browse...')
self.parse_btn = QPushButton('Parse...')
self.initUI()
...
def parse(self):
if self.file:
try:
parser = DBParser(self.file)
dbcheck = parser.isDB()
if dbcheck == True:
tablename, fields, rows = parser.getData()
self.popup = PopUp(tablename, fields, rows)
self.popup.show()
else:
QMessageBox.information(self, 'Warning', 'Right format but not CMS DB File')
except:
QMessageBox.critical(self, 'Error', "Invalid File Selected \nMust be .txt or .log format")
self.parse_btn.setEnabled(False)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
最佳答案
问题是您使用相同的属性:self.popup
如果您创建另一个小部件,它将替换它,消除以前的窗口,在这种情况下,解决方案是创建一个存储 PopUp
的列表。 ,另一方面建议启用属性 Qt::WA_DeleteOnClose
当 PopUp
时关闭后,它将从内存中删除,这样就不会保留不必要的内存。对于第二个要求的情况,一个选项是覆盖 closeEvent()
方法并关闭PopUp
,但要做到这一点,您必须验证它是否存在,因为当一个项目从内存中删除时,并不意味着您删除了列表中它的引用。使用sip.isdeleted()
import sip
# others imports
class App(QWidget):
def __init__(self):
super().__init__()
# ...
self.popups = [] # <---
def parse(self):
if self.file:
try:
parser = DBParser(self.file)
if parser.isDB():
tablename, fields, rows = parser.getData()
popup = PopUp(tablename, fields, rows) # <---
popup.setAttribute(Qt.WA_DeleteOnClose) # <---
popup.show() # <---
self.popups.append(popup) # <---
else:
QMessageBox.information(self, 'Warning', 'Right format but not CMS DB File')
except:
QMessageBox.critical(self, 'Error', "Invalid File Selected \nMust be .txt or .log format")
self.parse_btn.setEnabled(False)
def closeEvent(self, event):
for popup in self.popups: # <---
if not sip.isdeleted(popup): # <---
w.close() # <---
super(App, self).closeEvent(event)
关于python - 处理多个 QWidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53137788/