2011-01-29 18 views
18

Così ho creato la mia GUI con Qt per la mia applicazione Python. Sono giunto a una situazione in cui dopo che un pulsante è stato premuto, viene eseguito il rinvio appropriato, eseguiamo alcune attività, quindi ho bisogno di aprire una finestra separata che contiene una o due cose. Ma non riesco a capire come creare questa nuova finestra separata. Qualcuno potrebbe darmi un esempio di come crearne uno?Python: PyQt Popup Window

risposta

37

Un errore comune che può farti impazzire è dimenticare di memorizzare l'handle della finestra popup che crei in una variabile python che rimarrà attiva (ad esempio in un membro dati della finestra principale).

Quello che segue è un semplice programma che crea una finestra principale con un pulsante in cui si preme il pulsante si apre un popup

#!/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) 

Quello che penso possa essere sorprendente per gli utenti Python e può essere è il problema che si trovano ad affrontare è il fatto che se non si memorizza un riferimento al nuovo widget nel principale ad es utilizzando w = MyPopup(...) anziché self.w = MyPopup(...) apparentemente la finestra non viene visualizzata (in realtà è stata creata e immediatamente distrutta).

Il motivo è che quando la variabile locale w esce dall'ambito poiché nessuno fa esplicitamente riferimento al widget, il widget viene eliminato. Questo può essere visto chiaramente perché se premi di nuovo il pulsante vedrai che mentre il secondo popup appare il primo viene chiuso.

Ciò significa anche che se è necessario creare diversi popup, è necessario ad esempio inserirli in un elenco python e rimuoverli da questo elenco una volta che i popup vengono chiusi dall'utente. L'equivalente nell'esempio potrebbe essere modificato in self.w = [] nel costruttore e quindi in self.w.append(MyPopup(...)). Ciò consentirebbe di aprire diversi popup.

+0

Non dimenticare di aggiungere self.setupUi (auto-) alla __init__ della seconda finestra o widget se lo hai creato con Designer. –

3

In generale, è mostrare solo le finestre multiple senza genitori con someQWidget.show(), come:

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

Ma molto probabilmente, si vuole un Dialogo modale standard come this. Assicurati anche di capire modal dialogs.