PyQt : setCentralWidget non immédiat

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Je travaille avec Python 3.5 et PyQt 5, et je rencontre un souci pour changer le widget central de ma fenêtre (QMainWindow).

La fonction print_documents est connectée au signal clicked d'un bouton. Alors que je souhaiterais que le message s'affiche immédiatement, il se passe 5 secondes (le paramètre de sleep) avant que setCentralWidget ne prenne effet. J'ai le même effet de latence en remplaçant l'appel à sleep par d'autres instructions.

1
2
3
4
5
6
7
8
9
class MainWindow(QtWidgets.QMainWindow, Ui_main_window):
    def display_message(self, txt):
        widget = MessageWidget(txt)
        self.setCentralWidget(widget)

    def print_documents(self):
        self.display_message("Impression des documents en cours...")

        time.sleep(5)

Est-il possible de remédier à cela ? A quoi est-ce dû ?

A noter que mon objectif est de permuter le widget central le temps du traitement :

1
2
3
4
5
6
def print_documents(self):
    self.display_message("Impression des documents en cours...")

    time.sleep(5) # En vrai, un traitement

    self.display_current_project() # Cette fonction contient un appel à setCentralWidget

Le code précédent génère le comportement suivant : au clic sur le bouton, le widget central ne bouge pas pendant 5 secondes, puis on le voit clignoter, c'est-à-dire passer du message au projet courant. C'est comme si la fonction précédente était équivalente à la suivante :

1
2
3
4
5
def print_documents(self):
    time.sleep(5) # En vrai, un traitement

    self.display_message("Impression des documents en cours...")
    self.display_current_project() # Cette fonction contient un appel à setCentralWidget

Merci !

+0 -0

C'est tout à fait normal : Sous Qt, une émission d'un signal connecté à un slot se traduit par définitive à un appel classique au slot (immédiat ou différé). Dans tous les cas, ton slot est exécuté dans le thread principal (i.e. de ton IHM). Tant que ton slot n'aura pas fini son exécution (dans ton cas 5 secondes), ta boucle d'événements ne sera pas traitée et toute mise à jour attendra.

Si tu veux faire ce genre de chose, le plus simple est de passer par un QTimer pour attendre 5 secondes ou déplacer ton code métier dans un thread (cas classique).

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte