2016-10-24 39 views
0

我正在使用可视化程序的API中的Python 2.7。在其2016版本中,我使用PySide创建了一个GUI,它的工作很好。现在,在他们的新版2017版中,他们从PySide变成了PythonQt,所以我的导入和一些命令必须改变,但它仍然有效。如何使用PythonQt在API中正确关闭QWidget窗口

但是,如果我收我的GUI,并尝试进行的工作,例如打开一个现有的或新项目的2017年版本正在退出,有时有,有时没有错误消息,但该消息没有帮助的。

如果我闭上GUI窗口相同的方式,在2016版本中,程序被关闭。奇怪的是,如果我使用close命令,如果我在Windows 7 Pro中运行我的窗口独立程序,则会在程序中显示一个错误(Traceback(最近调用最后一次):File“”,第1152行,在closeEvent ValueError:slot quit() - > void需要QApplication实例作为第一个参数。),我的GUI已关闭,我可以继续工作。

所以我在我的GUI需要以某种方式被关闭,我无法弄清楚为止。在方案终端,其中,蟒命令可以被执行的功能或通过按压F-按钮功能,该功能被链接到 -

我的GUI是通过调用showMyGUI()打开。

# -*- coding: utf-8 -*- 

import sys, os 
progVers = getVredVersion()[:1] 
if progVers == "8": #2016-version 
    from PySide.QtCore import * 
    from PySide.QtGui import * 
elif progVers == "9": #2017-version 
    from PythonQt.QtCore import * 
    from PythonQt.QtGui import * 

class MainWindow(QWidget): 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     grid = QGridLayout() 
     grid.setSpacing(10) 

     ... 

     self.setWindowModality(Qt.ApplicationModal) 
     self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.WindowMaximizeButtonHint) 
     self.show() 

    def closeEvent(self,event): 
     progVers = getVredVersion()[:1] 
     if progVers == "8":  
      QApplication.instance().quit() 
     elif progVers == "9": 
      QApplication.quit() #as used for standalone in Windows 7 Pro 
     event.accept() 

def showMyGUI(): 
    app = QApplication.instance() 
    window = MainWindow() 
    app.exec_() 

keyF11 = vrKey(Key_F11) 
keyF11.connect(showMyGUI) 

谁能告诉我如何正确关闭我的GUI?

+0

你不能使用标准的'self.close()'关闭'MainWindow',它将结束'QApplication'了。 – furas

+0

已经尝试过,但正如我上面提到的,当我尝试继续工作时,这会关闭整个程序。但我现在找到了一个解决方案。 'MainWindow'现在继承于'QDialog'的形式,并且需要一个父类('def __init __(self,parent = None):'和'super(MainWindow,self).__ init __(parent)')。在创建'MainWindow'对象时,父窗口可以在2016版本中使用'verdMainWindow()'进行访问,在2017版本中使用'vrMainWindow'进行访问。刚刚发现了这一点,但感谢您的答案。 – JFT

+0

嗨@JFT,将答案添加到您的帖子中,然后在几天后给它回答! – darkgaze

回答

0

我的解决办法是: MainWindow现在继承形式QDialog,需要家长(def __init__(self, parent=None):和super(MainWindow, self).__init__(parent))。在创建MainWindow对象时,可以在2016版本中使用verdMainWindow()访问父窗口,在2017版本中使用vrMainWindow访问父窗口。我以这种方式创建该类的对象window=MainWindow(vrMainWindow)