2017-02-15 99 views
2

我有一個主窗口,我想在按鈕按下時打開另一個窗口(不是對話框)。我的問題是新窗口打開後幾乎立即關閉。我已經閱讀了可用的文章,並試圖實施解決方案,但似乎沒有運氣。這是我的整個代碼:PyQt:爲什麼新窗口在打開後立即關閉

import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class MainWindow (QMainWindow): 
    def __init__(self): 
     win = QWidget() 
     win.adjustSize() 
     grid=QGridLayout() 
     grid.setRowStretch(0, 1) 
     grid.setRowStretch(1, 1) 
     grid.setRowStretch(5, 1) 
     for i in range(0,5): 
      for j in range(0,4): 
       if i==0 and j==2: 
        l1=grid.addWidget(QLabel("Choose an option:"),i,j, 2, 2) 
       if i==2 and j==1: 
        b1= QPushButton("Get Best Match") 
        grid.addWidget(b1,i,j) 
       elif i==2 and j==2: 
        b2=QPushButton("Button2") 
        grid.addWidget(b2,i,j) 
       elif i==2 and j==3: 
        b3=QPushButton("Button3") 
        grid.addWidget(b3,i,j) 
     b5=grid.addWidget(QLabel(""),3,4) 
     b4=QPushButton("Button4") 
     grid.addWidget(b4,2,4) 
     w1=b1.clicked.connect(window1) 
     b2.clicked.connect(Win2) 
     b3.clicked.connect(Win3) 
     b4.clicked.connect(Win4)    
     win.setLayout(grid) 
     win.setGeometry(100,100,width//2,height//2,) 
     win.setWindowTitle("PYQT") 
     win.show() 
     win.setStyleSheet(""" 
     .QPushButton { 
     height: 30px ; 
     width: 20px ; 
     } 
     .QLabel { 
     qproperty-alignment: AlignCenter; 
     font-size:12pt 
     } 

     """) 
     sys.exit(app.exec_()) 

class window1(): 
    def __init__(self, pressed): 
     super(window1, self).__init__() 
     win1 = QWidget() 
     win1.adjustSize() 
     win1.setGeometry(100,100,width//2,height//2,) 
     win1.setWindowTitle("Get Best Match") 
     win1.show() 

if __name__ == '__main__': 

    app = QApplication(sys.argv) 
    screen_resolution = app.desktop().screenGeometry() 
    width, height = screen_resolution.width(), screen_resolution.height() 
    main=MainWindow() 

有人可以幫我這個嗎?我一直在困擾一段時間。

回答

1

窗口正在消失,因爲它在__init__函數的末尾超出了範圍。由於沒有進一步的引用,python垃圾收集器將其刪除。

通常PyQt對象保持對其子的引用,所以這不是問題。由於您希望小部件在單獨的窗口中打開,因此您無法將其分配給父項,因此您需要在其他位置存儲對其的引用。明顯的候選人是MainWindow類。

通過使用self.win = QWidget()而不是win = QWidget(),可以使win成爲MainWindow的成員。除非您關閉它,否則此窗口將在MainWindow的整個生命週期內保持打開狀態。

您的代碼存在其他問題,但這解釋了窗口消失的原因。

+0

我的問題是,當我點擊按鈕GetBestMatch,新窗口打開了第二個,然後關閉。但主窗口始終保持打開狀態(我想要的)。我實施了您所建議的更改,但似乎沒有工作 – Sarah

+0

好的,您不清楚您指的是哪個窗口。仔細檢查你的問題是雙重的。首先,您遇到了與我在「get best match」按鈕引用的'window1'類中描述的相同的問題。另一個問題是在連接信號時你傳遞了類名。這基本上是將類構造函數作爲一個插槽傳遞,它再次丟棄新創建的窗口。您需要連接到一個創建窗口並存儲引用的函數 – user3419537

+0

此外,'sys.exit(app.exec _())'內的'app.exec _()'啓動Qt事件循環。它不應該在任何班級內。將它移動到代碼的末尾 – user3419537