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 :

Centrage de QMainwindow selon la résolution de l'ordinateur [QtGui]


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2023
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2023
    Messages : 28
    Par défaut Centrage de QMainwindow selon la résolution de l'ordinateur
    Bonsoir , je suis débutant en PyQt et j'ai décidé de monter un petit jeu d’énigme jusque la j'ai réussis à combler tous les soucis rencontrés sauf 1 qui me gêne beaucoup , centrer ma QmainWindow selon la résolution de l'ordinateur qui exécute le code .
    Malgré de nombreux tests comme par exemple récupérer la valeur en x et y de la fenêtre et la taille de l'écran et ensuite y déplacer ma fenêtre ou encore ce morceau de code qui devrait normalement fonctionner mais qui pour moi , ne me centre absolument pas ma fenêtre ..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    qtRectangle = self.frameGeometry()
    centerPoint = QDesktopWidget().availableGeometry().center()
    qtRectangle.moveCenter(centerPoint)
    self.move(qtRectangle.topLeft())
    Pour plus de contexte car pendant mes test j'ai cru voir que cela avait de l'impact dans ma QMainwindow j'utilise un QStackedWidget que je centre pour afficher mes différents layout de page que j'ai séparé en plusieurs classes. Voila donc l'entiereté de ma QmainWindow :

    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
     
    class MainWindow(QMainWindow):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
             # set window properties
            self.setWindowTitle("Jeu de Piste Manon")
            qtRectangle = self.frameGeometry()
            centerPoint = QDesktopWidget().availableGeometry().center()
            qtRectangle.moveCenter(centerPoint)
            self.move(qtRectangle.topLeft())    
     
            self.central_widget = QStackedWidget()
            self.setCentralWidget(self.central_widget)
     
            self.principal = Principale(self)
            self.logo = LogoWindow(self)
            self.photo = Image13(self)
            self.qr = QRcode(self)
            self.final = Final(self)
     
            self.central_widget.addWidget(self.principal)
            self.central_widget.addWidget(self.logo)
            self.central_widget.addWidget(self.photo)
            self.central_widget.addWidget(self.qr)
            self.central_widget.addWidget(self.final)
     
            self.central_widget.setCurrentWidget(self.principal)
    J’espère que quelqu'un saura m'orienter vers le soucis !

    Merci !
    Maxcou

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Maxcou Voir le message
    ou encore ce morceau de code qui devrait normalement fonctionner mais qui pour moi , ne me centre absolument pas ma fenêtre
    La méthode "move()" d'un widget ne place pas le centre du widget mais son coin haut-gauche. Fatalement le widget n'apparait pas au centre de l'écran.
    Il te faut calculer les coordonnées du centre de ta QMainWindow par rapport à sa taille, puis retrancher ces coordonnées de celles du centre de ton écran lorsque tu veux la placer.

    Ou alors plus simple tu l'ouvres en mode "fullscreen" comme ça elle occupe tout ton écran et tu n'as plus de souci.

    Citation Envoyé par Maxcou Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class MainWindow(QMainWindow):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
    Dans un QMainWindow il n'y a pas que le parent comme paramètre possible !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class MainWindow(QMainWindow):
    	def __init__(self, *args, **kwargs):
    		super().__init__(*args, **kwargs)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    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à ce que j'utilise pour centrer mes fenêtres sur l'écran:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def centrefenetre(fen):
        """Place la fenêtre fen au milieu de l'écran
        """
        screen = QtWidgets.QDesktopWidget().screenGeometry()
        size = fen.frameSize()
        fen.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2)
    "fen" est la variable qui pointe sur la fenêtre. Si la fonction est appelée à l'intérieur de la fenêtre, on prend "self".

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2023
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2023
    Messages : 28
    Par défaut
    Merci pour vos deux réponse , en revanche j'ai testé ta méthode Tyrtamos mais je l'avais déjà essayé d'une manière un peu différente et j'avais abandonné l'idée car je me retrouve avec cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Exception has occurred: TypeError
    arguments did not match any overloaded call:
      move(self, a0: QPoint): argument 1 has unexpected type 'float'
      move(self, ax: int, ay: int): argument 1 has unexpected type 'float'
      File "C:\Users\maxim\Bureau\Projet_anniversaire_Manon\Projet_manon.py", line 24, in __init__
        self.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2)
      File "C:\Users\maxim\Bureau\Projet_anniversaire_Manon\Projet_manon.py", line 795, in <module>
        window = MainWindow()
                 ^^^^^^^^^^^^
    TypeError: arguments did not match any overloaded call:
      move(self, a0: QPoint): argument 1 has unexpected type 'float'
    La méthode move ne peut prendre que des arguments de type int non ? Pour pallier cela j'avais donc fait la division euclidienne avec "//2" mais cela ne centrait pas correctement la fênetre non plus , peut-être puis-je changer la méthode move afin de lui donner des floats a la place de int ?

    Maxcou

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Maxcou Voir le message
    La méthode move ne peut prendre que des arguments de type int non ?
    Ben oui puisqu'un écran ne peut pas avoir de "demi-pixel". Je pense que tyrtamos t'a montré par erreur un exemple P2.

    Citation Envoyé par Maxcou Voir le message
    Pour pallier cela j'avais donc fait la division euclidienne avec "//2" mais cela ne centrait pas correctement la fênetre non plus
    Non là faut arrêter. Même si les dimensions sont impaires et que la division euclidienne par 2 amène à l'unité inférieure, c'est visuellement imperceptible. L'erreur ne vient pas de la division par 2 mais des calculs faits plus en amont. Peut-être la "manière un peu différente" que tu as mentionné...

    Citation Envoyé par Maxcou Voir le message
    peut-être puis-je changer la méthode move afin de lui donner des floats a la place de int ?
    Et comment comptes-tu faire cela? En surchargeant la méthode move() pour lui faire accepter des float? Admettons. Mais au final il faut quand-même appeler la méthode move() originelle, celle qui n'accepte que des int. Donc tu seras obligé de lui envoyer un float converti en int.
    Si la méthode move() a été prévue pour des int c'est parce qu'une position sur un écran ne se mesure qu'en int (cf l'exemple du demi-pixel).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2023
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2023
    Messages : 28
    Par défaut
    Effectivement vu avec l'exemple des demi pixel c'est plus clair de pourquoi elle ne prend que des int !

    Je suis peut-etre trop perfectionniste mais en utilisant le code de tyrtamos cf :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    screen = QDesktopWidget().screenGeometry()
    size = self.frameSize()
    self.move((screen.width() - size.width()) // 2, (screen.height() - size.height()) // 2)

    J'obtiens ce centrage : Nom : Capture.PNG
Affichages : 324
Taille : 242,6 Ko .

    Par ailleurs j'ai testé mon programme sur un autre ordinateur et du fait je pense de la résolution différentes ma fenêtre est beaucoup trop grande donc certains éléments , sont invisibles , pourtant j'ai bien bloquer la hauteur avec la méthode setFixedHeight() mais je pense que cela dépend de la résolution encore une fois , donc pas la même incidence sur deux machines différentes . Pourrais-tu m'éclairer la dessus ?

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

Discussions similaires

  1. problème d'affichage selon la résolution de l'ecran
    Par babouba dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 26/07/2007, 17h51
  2. [API] Fenêtre adaptable selon la résolution
    Par juni38 dans le forum Visual C++
    Réponses: 4
    Dernier message: 26/07/2007, 09h06
  3. Problème de positionnement de menu en cascade selon la résolution
    Par sense_of_life dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 07/03/2007, 15h29
  4. Affichage selon la résolution de l'ecran
    Par uloaccess dans le forum Access
    Réponses: 3
    Dernier message: 06/01/2006, 12h53
  5. Pb pour afficher une page selon la résolution de l'écran
    Par magic8392 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 24/10/2005, 11h35

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