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?

19
demandé sur Morphine 2011-01-29 22:14:11

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.

41
répondu 6502 2011-01-29 20:27:39

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.

3
répondu flying sheep 2013-03-09 15:56:45