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

PyQt Python Discussion :

Empêcher l'application de sortir de l'écran


Sujet :

PyQt Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 3
    Par défaut Empêcher l'application de sortir de l'écran
    Bonjours,

    Dans le cadre d'un projet, je souhaite bloquer l'application pour qu'elle ne dépasse pas les limite de l'écran.

    L'utilisateur peut le placer ou il veut tans qu'il soit entièrement en entier.

    Après de longue recherche, je n'ai toujours pas trouvé!

    Si quelqu'un a une idée, je suis preneur!


    Avec mes remerciements.

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Voilà une idée de solution qui fonctionne avec encore quelques petits défauts.

    Partons du principe que nous avons une fenêtre sous forme d'une classe héritant de QWidget ou de QMainWindow.

    A chaque fois qu'on déplace cette fenêtre avec la souris, la méthode moveEvent est appelée. L'idée est donc de surcharger cette méthode pour détecter quand la fenêtre sort de l'écran pour la y remettre. A noter qu'on ne peut pas se contenter de refuser le mouvement, parce que la fenêtre est déjà dans la nouvelle position quand la méthode est appelée (et passe l'ancienne position en argument).

    Mais, car il y a un "mais", on ne peut pas CHANGER la position de l'écran à l'intérieur de la méthode moveEvent, car ce changement de position appellera de nouveau moveEvent, etc... Ça fera un beau plantage.

    Heureusement, il y a une astuce: le réappel de la méthode ne se fera que si la fenêtre est VISIBLE (non-hide). Il suffira donc de cacher la fenêtre, de provoquer le changement de position, et de réafficher la fenêtre.

    Voilà un petit exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
    # Python 2.7
     
    import sys, os
    from PyQt4 import QtCore, QtGui
     
    #############################################################################
    class Fenetre(QtGui.QWidget):
     
        def __init__(self, parent=None):
            super(Fenetre, self).__init__(parent)
            self.setWindowTitle(u"test")
            self.resize(400, 300)
     
            # calcul des dimensions disponibles de l'écran courant
            self.screen = QtGui.QDesktopWidget().availableGeometry()
            self.wscreen, self.hscreen = self.screen.width(), self.screen.height()
     
        def moveEvent(self, xyold):
            # nouvelle position de la fenêtre
            x, y = self.x(), self.y()
            # taille courante de la fenêtre
            wfen, hfen = self.width(), self.height() 
            # repositionnement si la position est hors limite
            if x<0:
                self.hide(); self.move(0, y); self.show()
            if y<0:
                self.hide(); self.move(x, 0); self.show()
            if x>self.wscreen-wfen:
                self.hide(); self.move(self.wscreen-wfen-1, y); self.show()
            if y>self.hscreen-hfen:
                self.hide(); self.move(x, self.hscreen-hfen-1); self.show()
     
    #############################################################################
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    Je n'ai pas fait de test avec des fenêtres complexes, mais sur l'exemple ci-dessus, ça marche très bien. Il faut cependant lancer le programme en console pour neutraliser un éventuel effet parasite de l'outil de développement.

    Il reste deux petites imperfections:

    ==> je n'ai pas l'impression d'avoir obtenu la dimension "hors-tout" de la fenêtre, mais seulement celle de son cadre interne. De ce fait, la fenêtre dépasse un peu à droite et en bas.

    ==> malgré l'utilisation de "availableGeometry()", je n'ai pas réussi à neutraliser sous Windows la ligne des tâches en bas de l'écran: en principe, la fenêtre ne devrait pas passer en dessous.

    Enfin, dans une application professionnelle, il faudrait mettre à jour les dimensions de l'écran au cas où des vicieux voudraient changer cette résolution pendant l'exécution du programme .

    Si tu réussis à améliorer cette solution: donne ces améliorations: ça m'intéresse!


    [Edit]: j'ai trouvé! les dimensions hors-tout de la fenêtre sont données par "frameSize". Il suffit donc de remplacer la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            wfen, hfen = self.width(), self.height()
    par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            wfen, hfen = self.frameSize().width(), self.frameSize().height()
    Et les 2 points faibles sont éliminées: la fenêtre reste bien à l'intérieur de l'écran, et ne passe plus sous la barre des tâches!

    Reste à voir si ça marche sans inconvénient avec des fenêtres complexes.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 3
    Par défaut
    Merci

    je vais essayer

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 3
    Par défaut
    Merci ca marche parfaitement!!

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/03/2013, 10h03
  2. empêcher mainframe sortir de l'écran
    Par clem86 dans le forum MFC
    Réponses: 5
    Dernier message: 30/07/2008, 14h13
  3. empêcher un break de sortir de plusieurs boucles imbriquées
    Par quidam66 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/06/2006, 21h52
  4. Empêcher un curseur de sortir d'une JWindow
    Par Bighobbit dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 24/03/2006, 17h10
  5. Réponses: 4
    Dernier message: 07/01/2006, 19h10

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