2012-11-02 48 views
0

我在我的python gui应用程序中打开新窗口时出现问题。我有3个班级(首次登录显示,并且打开2个窗口)。这工作得很好:从python gui打开新窗口

class LoginDialog(QtGui.QDialog): 
    def __init__(self, parent = None): 
     super(LoginDialog, self).__init__(parent) 
    ..... 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent = None): 
      QtGui.QWidget.__init__(self, parent) 
    ..... 

class ImageViewerMainWindow(QtGui.QMainWindow): 
    def __init__(self, path, parent = None): 
     super(ImageViewerMainWindow, self).__init__(parent) 
    ..... 

if __name__ == "__main__": 
    qtApp = QtGui.QApplication(sys.argv) 

    loginDlg = LoginDialog() 
    if not loginDlg.exec_(): 
     sys.exit(-1) 

    MyMainWindow = MainWindow() 
    MyMainWindow.show() 

    viewer = ImageViewerMainWindow("C:\image.jpg") 
    viewer.show() 

    sys.exit(qtApp.exec_()) 

我需要从主窗口执行浏览器,但是当我把它这样,它只是闪烁并消失:

class MainWindow(QtGui.QMainWindow): 
     def __init__(self, parent = None): 
       QtGui.QWidget.__init__(self, parent) 
     ..... 
     def DoOpenImageViewer(self): 
       viewer = ImageViewerMainWindow("C:\image.jpg") 
       viewer.show() 

回答

1

你需要保持对它的引用您浏览器,否则当viewer超出范围并被垃圾收集时,新窗口被销毁。 如果你只需要一个窗口的时间,你可以这样做:

class MainWindow(QtGui.QMainWindow): 
     def __init__(self, parent = None): 
       QtGui.QWidget.__init__(self, parent) 
     ..... 
     def DoOpenImageViewer(self): 
       self.viewer = ImageViewerMainWindow("C:\image.jpg") 
       self.viewer.show() 

否则,你可以使用一个列表来存储引用。

+0

就是这样,谢谢:) – Aleksandar

+0

我已经使用了一个列表来存储引用,如你所建议的,我还有一个问题:当MainWindow关闭时如何关闭所有打开的窗口?我已经在MainWindow类中像这样退出函数: 'def DoQuit(self): self.DoLogout() QtGui.qApp.quit()' – Aleksandar

+1

您可以遍历列表并在每个窗口小部件上调用disposeLater,清除列表还应该处理所有窗口,因为它们之前没有保持打开状态(至少如果没有其他参考)。 – mata