zetcode tutorials tutorial pqt5 gui python pyqt

python - pqt5 - tutorials point pyqt



Python: ventana emergente de PyQt (2)

En general, solo se muestran varias ventanas sin someQWidget.show() con someQWidget.show() , como:

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

Pero lo más probable es que quieras un diálogo modal estándar como this . También asegúrese de entender los diálogos modales .

Así que he estado creando mi GUI con Qt para mi aplicación Python. Ahora he llegado a una situación en la que después de presionar un botón para que se ejecute el aplazamiento diferido, realizamos algunas tareas y luego necesito abrir una ventana separada que contiene una o dos cosas. Pero parece que no puedo descubrir cómo crear esta nueva ventana separada. ¿Podría alguien darme un ejemplo de cómo crear uno?


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

El siguiente es un programa simple que crea una ventana principal con un botón donde presionar el botón 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 sorprender a los usuarios de Python es que el problema al que se enfrenta es el hecho de que si no almacena una referencia al nuevo widget en la principal, por ejemplo, utilizando w = MyPopup(...) lugar de self.w = MyPopup(...) la ventana aparentemente no aparece (en realidad se creó y se destruyó de inmediato).

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

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