2012-11-02 74 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