2011-01-29 118 views
18

所以我一直在爲我的Python應用程序創建我的GUI和Qt。現在我已經遇到了這樣一種情況:在按下按鈕之後,執行適當的延遲獲取,我們執行一些任務,然後我需要打開一個包含一兩個事物的單獨窗口。但我似乎無法弄清楚如何創建這個新的獨立窗口。任何人都可以給我一個如何創建一個例子嗎?Python:PyQt彈出窗口

回答

37

一個可以讓你瘋狂的常見錯誤是忘記存儲在一些將保持活動狀態的python變量(例如在主窗口的數據成員中)中創建的彈出窗口的句柄。

下面是一個簡單的程序,有一個按鈕,其中按下按鈕會打開一個彈出

#!/usr/bin/env python 
#-*- coding: utf-8 -*- 

import sys 
from PyQt4.Qt import * 

class MyPopup(QWidget): 
    def __init__(self): 
     QWidget.__init__(self) 

    def paintEvent(self, e): 
     dc = QPainter(self) 
     dc.drawLine(0, 0, 100, 100) 
     dc.drawLine(100, 0, 0, 100) 

class MainWindow(QMainWindow): 
    def __init__(self, *args): 
     QMainWindow.__init__(self, *args) 
     self.cw = QWidget(self) 
     self.setCentralWidget(self.cw) 
     self.btn1 = QPushButton("Click me", self.cw) 
     self.btn1.setGeometry(QRect(0, 0, 100, 30)) 
     self.connect(self.btn1, SIGNAL("clicked()"), self.doit) 
     self.w = None 

    def doit(self): 
     print "Opening a new popup window..." 
     self.w = MyPopup() 
     self.w.setGeometry(QRect(100, 100, 400, 200)) 
     self.w.show() 

class App(QApplication): 
    def __init__(self, *args): 
     QApplication.__init__(self, *args) 
     self.main = MainWindow() 
     self.connect(self, SIGNAL("lastWindowClosed()"), self.byebye) 
     self.main.show() 

    def byebye(self): 
     self.exit(0) 

def main(args): 
    global app 
    app = App(args) 
    app.exec_() 

if __name__ == "__main__": 
    main(sys.argv) 

我認爲,可奇怪的Python用戶,並且可以是你所面對的問題,建立主窗口事實上,如果你沒有在主要的存儲引用新的部件例如通過使用w = MyPopup(...)而不是self.w = MyPopup(...)窗口顯然不會出現(實際上它已經創建並立即銷燬)。

原因是,當本地變量w超出範圍,因爲沒有人明確引用該窗口小部件,窗口小部件被刪除。這可以清楚地看到,因爲如果再次按下按鈕,您會看到第二個彈出窗口出現時,第一個彈出窗口關閉。

這也意味着如果您需要創建多個彈出窗口,例如將它們放入python列表中,並且應該在用戶關閉彈出窗口後將其從列表中刪除。示例中的等效項可能會在構造函數中更改爲self.w = [],然後執行self.w.append(MyPopup(...))。這樣做可以讓你打開幾個彈出窗口。

+0

如果使用Designer創建self.setupUi(self),則不要忘記將self.setupUi(self)添加到第二個窗口或小部件的__init__中。 – 2011-08-23 00:46:08

3

一般情況下,你只需顯示多個無父無母的窗戶,someQWidget.show(),如:

w1 = QLabel("Window 1") 
w2 = QLabel("Window 2") 
w1.show() 
w2.show() 

但最有可能的,你想一個模式對話框的標準像this。另外請務必瞭解modal dialogs