Python PyQt4:从另一个QMainWindow打开并正确销毁一个QMainWindow

Python PyQt4:从另一个QMainWindow打开并正确销毁一个QMainWindow,python,pyqt4,qmainwindow,Python,Pyqt4,Qmainwindow,我的项目有问题。在其中我有一个主窗体,它有八个巨大的按钮来调用其他窗体。基本上,我用Qt设计器创建了ui文件,并使用pyuic4[ui\u file]-o[py\u file]方法创建表单,然后在main.py中导入所有表单 以下是部分代码: from myraflib import myEnv from myraflib import myFit import sys import sip for cl in ('QString', 'QVariant'): sip.setapi(c

我的项目有问题。在其中我有一个主窗体,它有八个巨大的按钮来调用其他窗体。基本上,我用Qt设计器创建了ui文件,并使用
pyuic4[ui\u file]-o[py\u file]
方法创建表单,然后在
main.py
中导入所有表单

以下是部分代码:

from myraflib import myEnv
from myraflib import myFit

import sys
import sip
for cl in ('QString', 'QVariant'):
    sip.setapi(cl, 2)

from uis.myraf import Ui_MainWindow
from uis.calibration import Ui_MainWindowCali
from uis.align import Ui_MainWindowAlign
from uis.photometry import Ui_MainWindowPhoto
from uis.graph import Ui_MainWindowGraph
from uis.editor import Ui_MainWindowEdit
from uis.scheduler import Ui_MainWindowSche
from uis.settings import Ui_MainWindowSett
from uis.help import Ui_MainWindowHelp
from uis.error import Ui_MainWindowErr

from PyQt4 import QtGui
from PyQt4 import QtCore
import gui as g
import functions as f

from fPlot import *


class MyForm(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self, verb=True):
        super(MyForm, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.verb = verb
        self.ggui = g.Gui(verb=self.verb)
        self.meetc = myEnv.etc(verb=self.verb)

        self.child = {"calib": None, "align": None, "photo": None,
            "graph": None, "editor": None, "sched": None, "setti": None,
            "help": None}

        ...

        self.ui.pushButton.clicked.connect(lambda: self.show_form("calib"))

        self.ui.pushButton_2.clicked.connect(lambda: self.show_form("align"))

        self.ui.pushButton_3.clicked.connect(lambda: self.show_form("photo"))

        self.ui.pushButton_4.clicked.connect(lambda: self.show_form("graph"))

        self.ui.pushButton_5.clicked.connect(lambda: self.show_form("editor"))

        self.ui.pushButton_6.clicked.connect(lambda: self.show_form("sched"))

        self.ui.pushButton_7.clicked.connect(lambda: self.show_form("setti"))

        self.ui.pushButton_8.clicked.connect(lambda: self.show_form("help"))

        self.ui.actionQuit.triggered.connect(QtGui.qApp.quit)

    #Here my best friend. The problem guy is here
    def show_form(self, frm):
        try:
            forms = {"calib": MyFormCali(self), "align": MyFormAli(self),
                 "photo": MyFormPho(self), "graph": MyFormGra(self),
                 "editor": MyFormEdi(self), "sched": MyFormSch(self),
                 "setti": MyFormSet(self), "help": MyFormHel(self)}
            if self.child[frm] is None:
                self.child[frm] = forms[frm]
            self.child[frm].show()
        except Exception as e:
            self.meetc.print_if(e)

    ...

    def closeEvent(self, evnt):
        for i in self.child:
            if not self.child[i] is None:
                self.child[i].close()


class MyFormCali(QtGui.QMainWindow, Ui_MainWindowCali):
    def __init__(self, parent=None, verb=True):
        super(MyFormCali, self).__init__()
        self.ui = Ui_MainWindowCali()
        self.ui.setupUi(self)
        self.verb = verb
        self.ggui = g.Gui(verb=self.verb)
        self.meetc = myEnv.etc(verb=self.verb)
        self.mefo = myEnv.file_operation(verb=self.verb)
        self.mffo = myFit.fits_operation(verb=self.verb)
        self.mfho = myFit.header_operation(verb=self.verb)
        self.mfst = myFit.statistics_operation(verb=self.verb)
        self.fset = f.settings(verb=self.verb)

        ...

        self.child = {"error": None}

        ...

        self.ui.pushButton_11.clicked.connect(lambda:
            self.add_files(self.ui.listWidget_5))
        self.ui.pushButton_13.clicked.connect(lambda:
            self.add_files(self.ui.listWidget_6))
        self.ui.pushButton_15.clicked.connect(lambda:
            self.add_files(self.ui.listWidget_7))
        self.ui.pushButton_17.clicked.connect(lambda:
            self.add_files(self.ui.listWidget_8))

        ...

        self.info_update()

    ...

    def show_stats(self, list_dev):
        file_name = self.ggui.get_current_item_from_list(list_dev)

        ...

    def info_update(self):
        cda = 0

        ...

    def add_files(self, list_widget):
        files = self.ggui.get_file_list(self)
        if files[0]:
            self.ggui.set_values_to_list(self, list_widget, files[1])
        else:
            self.ggui.show_dialog(self, "info",
                "File Problem", "No file selected!")

        self.info_update()

    def closeEvent(self, evnt):
        for i in self.child:
            if not self.child[i] is None:
                self.child[i].close()
嗯,我可以分享整个项目,但总体思路是至少有九种形式,其中一种是主形式,名为
MyForm
,其他形式是
MyFormCali
MyFormAli
MyFormPho
,等等。主窗体使用
show()
方法调用其他窗体

问题是:

  • 在我在
    MyForm
    类中创建的
    show\u form()
    方法中,所有表单都在名为
    forms
    的字典类型变量中声明。当它发生时,实际上所有的表单都被加载,但没有显示任何表单。我可以看到所有的
    \uuuu init\uuu
    方法都被调用,并且没有可见的表单。我试图写一个长的
    if
    语句,但后来我能够多次打开同一个表单

  • 当我关上窗户时,它不会正常关闭。我的意思是,在关闭和重新打开过程之后,我仍然可以看到表单发生的更改。例如,我将一些值添加到
    QListWidget
    ,重新打开后仍然可以看到这些值


  • 长话短说,我需要一种更好的方法来打开/销毁另一个
    QMainWindow

    似乎您只隐藏窗口,所以在重新打开它(或者更确切地说,在取消隐藏之后)后,您必须(自己)清除字段。通常,您创建新实例时会得到空字段。在dict中,您可以保留类名
    MyFormAli
    而不是实例
    MyFormAli(self)
    ,并打开
    self.child[frm](self.show()
    以获取新的instance.Wow。第一个问题解决了。:)非常感谢。您可以尝试在主窗口中添加
    WA_DeleteOnClose
    属性:
    self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
    您似乎只隐藏窗口,因此在重新打开(或者更确切地说在取消隐藏后)后必须(自己)清除字段。通常,您创建新实例时会得到空字段。在dict中,您可以保留类名
    MyFormAli
    而不是实例
    MyFormAli(self)
    ,并打开
    self.child[frm](self.show()
    以获取新的instance.Wow。第一个问题解决了。:)非常感谢。您可以尝试在主窗口中添加
    WA\u DeleteOnClose
    属性:
    self.setAttribute(QtCore.Qt.WA\u DeleteOnClose)