处理多个QWidget

时间:2018-11-04 04:38:10

标签: python python-3.x pyqt pyqt5

我正在使用主要的QWidget构建一个解析器,该QWidget接受文件输入,然后打开一个新的QWidget并显示包含已解析数据的表。

但是,当我从主QWidget中选择一个新文件时,它将替换第二个QWidget,而不是实例化另一个QWidget。

此外,我希望能够关闭主QWidget并关闭所有QWidgets并退出程序。它现在没有这样做。

完整代码: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_())

1 个答案:

答案 0 :(得分:0)

问题是您使用的属性相同:self.popup,如果您创建另一个小部件,它将替换掉它,从而消除了先前的窗口,在这种情况下,解决方案是创建一个存储{{1 }},另一方面,建议启用属性PopUp,以使Qt::WA_DeleteOnClose关闭时,该属性从内存中删除,从而不会保留不必要的内存。对于第二个要求,一个选项是覆盖PopUp方法并关闭closeEvent(),但是要执行此操作,您必须验证它是否存在,因为从内存中删除某项时不会表示您在列表中删除了它的引用。使用PopUp

sip.isdeleted()