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
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.
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.
- 1. PyQt Window Focus
- 2. chrome extension, popup window height
- 3. jQuery Popup Window Valore restituito al padre
- 4. (Ruby || Python) window manager
- 5. Aggiornamento dinamico QGridLayout - Python PyQt
- 6. Converti interfaccia utente pyQt in python
- 7. Utilizzando QtDesigner con PyQT e Python 2.6
- 8. Raccomandazioni Python 3 e PyQt 4
- 9. Richiesta all'uscita nell'applicazione PyQt
- 10. PyQt/PySide - visualizzazione icone
- 11. popup di jquery popup
- 12. Chrome Facebook Connect Window Ridimensiona
- 13. Finestra di dialogo di login PyQt
- 14. Avvio di Python e PyQt - Esercitazioni, Libri, approcci generali
- 15. Creazione di eseguibili per Python 3 e PyQt
- 16. PyQt: Sempre in primo piano
- 17. problema di multiprocessing [pyqt, py2exe]
- 18. Impossibile visualizzare il popup popup
- 19. Implementare Hann Window
- 20. WPF window hosting usercontrol
- 21. $ (window) .hashchange() non funziona
- 22. Multi Window non funziona
- 23. jsdom window caching
- 24. Costruire un Window Manager
- 25. OpenGL cross platform window
- 26. Window Loaded and WPF
- 27. Window ActualTop, ActualLeft
- 28. R data.table sliding window
- 29. Corrupted Java Swing Window
- 30. Visual Studio Command Window
Non dimenticare di aggiungere self.setupUi (auto-) alla __init__ della seconda finestra o widget se lo hai creato con Designer. –