IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Réafficher une fenêtre masquée par une autre

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 10
    Points : 11
    Points
    11
    Par défaut Réafficher une fenêtre masquée par une autre
    Bonjour,

    J'ai une fenêtre de type QMainWindow a partir de laquelle je lance une commande, qui affiche au-dessus de ma fenêtre principale une fenêtre de résultat (NB: c'est la commande exécutée qui créée la fenêtre, pas mon application, autrement dit c'est pas une fenêtre Qt). Le problème est que quand je veux afficher ma fenêtre principale, la zone qui était masquée ne se redessine pas.

    D'après la faq Qt, voila ce que j'ai essaye:

    Du coup j'appel update() pour la forcer à se redessiner mais en vain. Comme mon application est gelée ( j'utilise QProcess et non QThread), j'appel QApplication::processEvents() sans résultat. J'ai cherche dans la classe QEvent s'il existait un événement associé a la sélection d'une fenêtre, que je pourrai redéfinir (en appelant update() dedans), j'ai vu QFocusEvent (QFocusEvent::ActiveWindow), c'est en cours de réflexion.

    Je ne récupère le contrôle de l'application et l'affichage qu'une fois la fenêtre lancée par la commande fermée.

    Donc j'ai 2 questions :

    1. comment permettre le redessinage de ma fenetre principale quand je recupere son focus ;
    2. comment dégeler l'application.


    Merci pour votre aide.

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Salut,

    Si tu utilises un QProcess, il te suffit de faire un "startDetached()" au lieu d'un "start()" pour éxécuter ton processus dans un processus système différent (et donc dans un thread différent). Ca devrait ne plus geler ton application, et donc la fenetre devrait se redessiner.

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Merci pour la réponse, mais j'ai oublie de préciser que je suis contraint de travailler en qt3, et que cette fonction qui me rendrait bien service, n'existe malheureusement pas en qt3. Du coup suis-je obligé d'utiliser la classe QThread ?

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Gulish Voir le message
    Salut,

    Si tu utilises un QProcess, il te suffit de faire un "startDetached()" au lieu d'un "start()" pour éxécuter ton processus dans un processus système différent (et donc dans un thread différent). Ca devrait ne plus geler ton application, et donc la fenetre devrait se redessiner.

    G.
    start lance un exe dans un process enfant. On peut manipuler les IO standard.
    startDetached lance un exe dans un process détaché. On ne peut rien manipuler.

    Donc le coup du gèle est autre chose.


    Peut tu montrer ce que tu fait?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Il y a 11 commandes mais celle dont je parlais était lancée avec "system" ( je m'excuse je m'en aperçois que maintenant grâce a ton message), et effectivement en la lançant avec un QProcess, l'application ne gèle plus, ce qui parait logique puisque la tache est effectuée en arrière plan de sorte que l'interface utilisateur reste réactive. Merci donc pour ton message ca m'a aider. Je me demande si pour lancer mes 10 commandes en parallèles, est-ce que je peux créer 10 QProcess, un pour chaque commande ( sachant qu'un QProcess est lance en arriere-plan), ou la les QThread seraient mieux ?

    Merci encore une fois !

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Citation:
    Envoyé par Gulish
    Salut,

    Si tu utilises un QProcess, il te suffit de faire un "startDetached()" au lieu d'un "start()" pour éxécuter ton processus dans un processus système différent (et donc dans un thread différent). Ca devrait ne plus geler ton application, et donc la fenetre devrait se redessiner.

    G.
    ----
    start lance un exe dans un process enfant. On peut manipuler les IO standard.
    startDetached lance un exe dans un process détaché. On ne peut rien manipuler.
    Oui pardon, je me suis trompé. C'est le QProcess::execute() qui est bloquant, et non pas le start().

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par g3rous Voir le message
    Il y a 11 commande mais celle dont je parlais etait lancee avec "system" ( je m'excuse je m'en apercois que maintenant grace a ton message ), et effectivement en la lancant avec un QProcess, l'application ne gele plus, ce qui parait logique puisque la tache est effectuee en arriere plan de sorte que l'interface utilisateur reste reactive. Merci donc pour ton message ca m'a aider. Je me demande si pour lancer mes 10 commandes en paralleles, est-ce que je peux creer 10 QProcess, un pour chaque commande ( sachant qu'un QProcess est lance en arriere-plan), ou la les QThread seraient mieux ?

    Merci encore une fois !
    Si tes commandes sont des exécutables alors il faut utiliser QProcess. QThread sert à exécuter du code de l'application courante.
    Un process et un thread ne sont pas la même chose.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/04/2011, 08h06
  2. Réponses: 2
    Dernier message: 17/01/2008, 11h47
  3. Réponses: 1
    Dernier message: 21/12/2007, 21h27
  4. Réponses: 3
    Dernier message: 27/09/2006, 15h38
  5. Réponses: 11
    Dernier message: 06/12/2005, 08h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo