Python PyQt4:从另一个QMainWindow打开并正确销毁一个QMainWindow
我的项目有问题。在其中我有一个主窗体,它有八个巨大的按钮来调用其他窗体。基本上,我用Qt设计器创建了ui文件,并使用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
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)