2011-01-29 76 views
18

Así que he estado creando mi GUI con Qt para mi aplicación Python. Ahora llegué a una situación en la que, después de presionar un botón, se ejecuta el aplazamiento apropiado, realizamos algunas tareas y luego necesito abrir una ventana separada que contenga una o dos cosas. Pero parece que no puedo imaginar cómo crear esta nueva ventana separada. ¿Alguien podría darme un ejemplo de cómo crear uno?Python: Ventana emergente de PyQt

Respuesta

37

Un error común que puede volverse loco es olvidarse de guardar el controlador de la ventana emergente que crea en alguna variable de Python que permanecerá activa (por ejemplo, en un miembro de datos de la ventana principal).

El siguiente es un sencillo programa que crea una ventana principal con un botón que al presionar el botón se abre una ventana emergente

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

Lo que creo que puede ser sorprendente para los usuarios de Python y puede ser es el problema que se enfrentan es el hecho de que si no almacena una referencia al nuevo widget en el principal, por ejemplo al usar w = MyPopup(...) en lugar de self.w = MyPopup(...), la ventana aparentemente no aparece (en realidad se creó y se destruye inmediatamente).

La razón es que cuando la variable local w queda fuera del alcance, ya que nadie hace referencia explícitamente al widget, el widget se elimina. Esto se puede ver claramente porque si presiona de nuevo el botón, verá que cuando aparece la segunda ventana emergente, se cierra la primera.

Esto también significa que si necesita crear varias ventanas emergentes, por ejemplo, debe ponerlas en una lista python y debe eliminarlas de esta lista una vez que el usuario cierre las ventanas emergentes. El equivalente en el ejemplo podría estar cambiando a self.w = [] en constructor y luego haciendo self.w.append(MyPopup(...)). Hacer eso le permitiría abrir varias ventanas emergentes.

+0

No olvides agregar self.setupUi (self) al __init__ de la segunda ventana o widget si lo creaste con Designer. –

3

general, que acaba de mostrar varias ventanas sin padres con someQWidget.show(), como:

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

Pero lo más probable es que quieren un diálogo estándar de modal como this. También asegúrese de comprender modal dialogs.

Cuestiones relacionadas