python - 处理多个 QWidget

标签 python python-3.x pyqt pyqt5

我正在构建一个带有主 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_DeleteOnClosePopUp 时关闭后,它将从内存中删除,这样就不会保留不必要的内存。对于第二个要求的情况,一个选项是覆盖 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/

相关文章:

用于 diffstat 输出的 Python 正则表达式

qt - QBrush - 缩放标准填充点画图案?

python - PyQt:防止在 QDialog 中调整大小和最大化?

python - 如何为组合框选择正确的列

python - 添加列并选择总和最大的列

python-dateutil - RRule - 不同工作日的不同时间

python - 通过 Python 写入现有的命名管道

python-3.x - 如何在不使用 @hydra.main() 的情况下获取 Hydra 配置

python - df.groupby() 需要修改帮助

python - 使用 str 中的常量值在 pandas df 中添加日期列