Python: Fenêtre Popup PyQt
J'ai donc créé mon interface graphique avec Qt pour mon application Python. Je suis maintenant arrivé à une situation où après qu'un bouton a été poussé le délai approprié est exécuté, nous effectuons quelques tâches puis je dois ouvrir une fenêtre séparée qui contient une ou deux choses. Mais je ne vois pas comment créer cette nouvelle fenêtre séparée. Quelqu'un pourrait-il me donner un exemple de comment en créer un?
2 réponses
une erreur courante qui peut vous rendre fou est d'oublier de stocker la poignée de la fenêtre popup que vous créez dans une variable python qui restera vivante (par exemple dans un membre de données de la fenêtre principale).
ce qui suit est un programme simple qui crée une fenêtre principale avec un bouton où appuyer sur le bouton ouvre 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)
ce que je pense peut être surprenant pour les utilisateurs de Python et peut-être est le problème auquel vous faites face est le fait que si vous ne stockez pas référence au nouveau widget dans le main par exemple en utilisant w = MyPopup(...)
au lieu de self.w = MyPopup(...)
la fenêtre n'apparaît apparemment pas (en fait elle est créée et elle est immédiatement détruite).
la raison est que lorsque la variable locale w
sort de la portée car personne ne renvoie explicitement le widget le widget est supprimé. Cela peut être vu clairement parce que si vous appuyez à nouveau sur le bouton, vous verrez que la deuxième fenêtre apparaît le premier est fermé.
ceci aussi signifie que si vous avez besoin de créer plusieurs popups vous avez par exemple les mettre dans une liste python et vous devez les supprimer de cette liste une fois les fenêtres pop-up sont fermés par l'utilisateur. L'équivalent dans l'exemple pourrait changer en self.w = []
dans le constructeur et ensuite de faire self.w.append(MyPopup(...))
. Faire cela vous permettrait d'ouvrir plusieurs popups.
Généralement, il suffit d'afficher plusieurs fenêtres sans parent avec someQWidget.show()
, comme ceci:
w1 = QLabel("Window 1")
w2 = QLabel("Window 2")
w1.show()
w2.show()
mais très probablement, vous voulez un dialogue standard modal comme . Veillez également à comprendre boîtes de dialogue modales.