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
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.
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.
- 1. Diseñar la ventana emergente de un QCompleter en PyQt
- 2. ¿Cómo puedo personalizar la ventana emergente QCompleter en PyQt?
- 3. Ventana emergente en winforms
- 4. Ventana emergente, Pantalla central
- 5. WPF ventana emergente
- 6. Ventana emergente con imagen
- 7. Ventana emergente de eclipse javadoc
- 8. Ventana emergente valor de retorno
- 9. Abra una segunda ventana en PyQt
- 10. ventana emergente de cromo emergente y fondo ajax
- 11. Ventana emergente nunca se cierra
- 12. ventana emergente bloqueada en Chrome
- 13. Ventana emergente Razor MVC 3
- 14. Ventana emergente programada en Android
- 15. Ventana emergente arriba Teclado virtual
- 16. ventana emergente en cualquier aplicación
- 17. traer ventana emergente al frente
- 18. Abrir una ventana emergente modal
- 19. Ventana emergente en Java Swing
- 20. Ventana emergente de WPF: ¿Cómo poner un borde alrededor de la ventana emergente?
- 21. Deshabilitar ventana emergente de globo de ASP.NET
- 22. Refrescando ventana principal después de cerrar ventana emergente
- 23. Ventana emergente de inicio del servicio
- 24. ¿Cómo cerrar una ventana emergente de Liferay.util.openWindow?
- 25. extensión de cromo, ventana emergente altura
- 26. Tamaño de la ventana emergente en android
- 27. Cómo cerrar la ventana emergente y redireccionar la ventana principal
- 28. GWT Ventana emergente en la nueva ventana del navegador
- 29. Actualizar ventana padre cuando la ventana emergente está cerrada
- 30. Abrir página en una nueva ventana sin ventana emergente
No olvides agregar self.setupUi (self) al __init__ de la segunda ventana o widget si lo creaste con Designer. –