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

  1. #1
    Membre à l'essai
    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
    Points : 11
    Points
    11
    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
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 717
    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 717
    Points : 31 028
    Points
    31 028
    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 éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 473
    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 473
    Points : 9 270
    Points
    9 270
    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".
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Membre à l'essai
    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
    Points : 11
    Points
    11
    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
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 717
    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 717
    Points : 31 028
    Points
    31 028
    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 à l'essai
    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
    Points : 11
    Points
    11
    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 : 181
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 ?

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 717
    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 717
    Points : 31 028
    Points
    31 028
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Maxcou Voir le message
    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
    Alors c'est vrai qu'il y a très peu de différence mais framesize() ne donne pas la taille exacte mais la taille oté de 1. J'ai par exemple créé un bouton (btn=QPushButton("Hello world!")) puis l'ai taillé en 500x300 (btn.resize(500, 300)). Quand je demande directement btn.width() et btn.height() je récupère bien 500 et 300 mais si je passe par btn.frameSize() je récupère 499 et 299. Après (je ne connais pas cette méthode) peut-être qu'elle fait des adaptations en fonction du ratio (16/9 etc) ou autre.

    De même moi j'ai utilisé QDesktopWidget().availableGeometry() et je n'ai pas exactement les mêmes valeurs que pour QDesktopWidget().screenGeometry(). Pour le "screen" il donne (0, 0, 1406, 891) et pour le "available" il donne (0, 25, 1406, 841). Pareil je connais pas le détail des différences mais peut-être que le "available", avec son espèce de "marge", donne l'espace "visible" ou autre connerie de ce genre. Toutefois, le "center()" pour les deux donne exactement la même valeur.
    Or vu que moi je passe par center() pour faire mes calculs, et que toi tu passes par width() et height() qui fluctuent selon certains détails, fatalement le truc ne tombe peut-être pas juste.

    Tu devrais essayer
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    c=app.desktop().availableGeometry().center()
    self.move(c.x() - self.width() // 2, c.y() - self.height() // 2)

    [edit]Voici un petit bout de code, que j'ai créé via mon premier exemple Qt (dispo sur ce site dans "mes sources postés" accessibles via le petit rectangle noir au dessus de mon avatar à gauche de la page) qui montre la différence entre "available" et "screen"
    Code python : 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
    #!/usr/bin/env python3
    # coding: utf-8
     
    # On importe les bibliothèques nécessaires
    from PyQt5.QtWidgets import QApplication, QPushButton
    import sys
     
    def move():
    	f=pos.pop(0)
    	btn.setText("%s: %s\ncenter=%s" % (f[0], f[1], f[1].center()))
    	btn.move((f[1].width() - btn.width()) // 2, (f[1].height() - btn.height()) // 2)
    	pos.append(f)
     
    # L'application (élément de base)
    app=QApplication(sys.argv)
    pos=[
    	("available", app.desktop().availableGeometry()),
    	("screen", app.desktop().screenGeometry()),
    ]
     
    # Le premier widget (élément visualisable) de l'application: un simple bouton
    btn=QPushButton("", clicked=move)
    btn.resize(500, 300)
     
    # Positionnement bouton
    move()
     
    # On affiche le bouton
    btn.show()
     
    # Lancement boucle de traitement des évènements Qt (sans elle rien ne se fait)
    sys.exit(app.exec_())
    Le principe est simple: j'ai stocké les deux valeurs screenGeometry() et availableGeometry()) dans une liste et à chaque appui sur le bouton, j'appelle une fonction qui
    • extrait la première valeur
    • positionne le bouton selon les calculs faits à partir de cette valeur
    • positionne le texte du bouton pour montrer la valeur en cours
    • place la valeur extraite en fin de liste (comme un tapis roulant)

    C'est pas le code le plus propre de la création mais j'avais pas envie de me prendre la tête à faire de l'objet et il suffit pour la démo. Et quand on le lance, on voit bien le bouton qui bouge à chaque fois qu'on appuie dessus (et le texte qui varie avec).

    Et euh... je ne pige pas la phrase "par quel moyen t'as plus grande chute a eu lieu". "T'as" ce n'est pas une conjugaison (la forme correcte est "tu as") mais même avec ça, le sens des mots va à l'encontre total du sens présumé de la phrase. Et puis le "moyen" d'une chute c'est plus ou moins la gravitation universelle et l'attirance des masses...
    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]

  8. #8
    Membre à l'essai
    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
    Points : 11
    Points
    11
    Par défaut
    Merci de nouveau du temps que tu consacres a mon soucis , j'ai donc testé ton code et en effet on voit bel et bien le bouton changer de place mais pour ma part uniquement en hauteur , il reste a la même (et bonne place en largeur). En ayant fait les calculs ,son "vrai" centre est bien sa première position autrement dit sa position calculé avec "available" et non "screen" comme tu le mentionnes .

    En revanche lorsque je test le code avec "available " dans mon programme , une nouvelle fois cela corrige la légère erreur de centrage verticale mais , cela reste exactement le même positionnement horizontal , et je cherche a comprendre comment cela est possible ..

    J'ai fait plusieurs tests pour tenter de comprendre comment cela fonctionne les voici , si tu as une explication plus claire je suis preneur ..

    Avec (condition sur la fixation de la hauteur pour garder un affichage propre):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      self.setFixedHeight(830)
     
     
            c=app.desktop().availableGeometry().center()
            self.move(c.x() - self.width() // 2, c.y() - self.height() // 2)
     
            self.central_widget = QStackedWidget()
            self.setCentralWidget(self.central_widget)
    Nom : setheight.PNG
Affichages : 158
Taille : 238,8 Ko

    Avec (un rezise):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     self.setWindowTitle("Jeu de Piste Manon")
            self.resize(1000,700)
     
     
            c=app.desktop().availableGeometry().center()
            self.move(c.x() - self.width() // 2, c.y() - self.height() // 2)
    Nom : resize.PNG
Affichages : 154
Taille : 218,8 Ko

    Avec( sans resize ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        c=app.desktop().availableGeometry().center()
            self.move(c.x() - self.width() // 2, c.y() - self.height() // 2)
     
            self.central_widget = QStackedWidget()
            self.setCentralWidget(self.central_widget)
    Nom : sans_resize.PNG
Affichages : 158
Taille : 237,2 Ko

    La ou ma fenêtre finit finalement centré au mieux c'est avec le resize() , mais pourquoi ? lorsque je n'indique aucun resize , quelle taille prend-t-il en compte ? Et du coups elle ne doit pas être "bonne" car comme dans le dernier test , la fenêtre ne finit pas du tout centrée..
    Et enfin dernière question lorsque je fais un rezise() , est-ce que cela dépend de la résolution de l'écran ? Je souhaite que la taille de la fenêtre s’adapte a toute résolution afin que chaque éléments soient bel et bien visible et que le programme soit fonctionnel sans avoir a redimensionner la fenêtre sois même .

    Ps: Merci j'avais complètement fait une énorme faute d’inattention , c'est bien le possessif "ta" et non "t'as" ...
    Merci de votre aide !

  9. #9
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 156
    Points : 4 570
    Points
    4 570
    Par défaut
    bonjour

    Si la fenetre est bonne après resize, c'est que tu fais trop tôt ton calcul (ta fenêtre va s'ajuster au contenu après ). Il faut donc retarder au maximum ton replacement. Peut-être envoyer à la place un "event" qui va déclencher cette action de centrage.

    Mais je pense plus à une mauvaise conception : la fenêtre se cale sur ton label . Pas de sens, lorsque tu vas cliquer sur "suivant".
    $moi= ( !== ) ? : ;

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 717
    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 717
    Points : 31 028
    Points
    31 028
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Maxcou Voir le message
    La ou ma fenêtre finit finalement centré au mieux c'est avec le resize()
    Exact. Et si je reprends mon code de test mais que j'enlève le "resize()", la toute première position est totalement à l'ouest. Ensuite quand je clique sur le bouton, les autres positions ça va.

    Citation Envoyé par Maxcou Voir le message
    mais pourquoi ? lorsque je n'indique aucun resize , quelle taille prend-t-il en compte ?
    Tu as aussi le droit d'afficher les valeurs que tu veux connaitre. En modifiant le code précédent et en mettant dans le bouton le texte suivant btn.setText("%s: %s\ncenter=%s\nbtn=%s" % (f[0], f[1], f[1].center(), btn.size())) j'obtiens (640, 480).
    Alors pourquoi sans resize() ça ne fonctionne pas...???
    Mais je remarque que si j'inverse le show() et le move() là ça marche, le bouton est calé au centre de mon écran. Mais en retour la taille du bouton est ridicule (37, 25).
    On peut aussi rester en l'état, avec le move placé avant le show, et s'il faut un "resize()" pour fonctionner, alors tu peux écrire btn.resize(btn.size()). C'est con mais si c'est la seule solution...

    Citation Envoyé par Maxcou Voir le message
    Ps: Merci j'avais complètement fait une énorme faute d’inattention , c'est bien le possessif "ta" et non "t'as" ...
    Heureux que la grammaire ne soit pas pour toi une vague notion aussi nébuleuse que la gravitation quantique à boucle. C'est assez rare sur le net

    Citation Envoyé par papajoker Voir le message
    Si la fenetre est bonne après resize, c'est que tu fais trop tôt ton calcul
    J'y ai pensé aussi. J'ai tenté de créer un bouton contenant un texte "neutre" (cf mon exemple) mais ça n'a rien donné. La notion de "moment" doit avoir son importance en effet (j'ai aussi tenté plusieurs "move()" dans le vide au tout début là encore sans résultat) mais je ne vois pas trop quand il faut le faire.
    Le btn.resize(btn.size()) semble être le meilleur candidat pour solutionner le truc.
    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]

  11. #11
    Membre à l'essai
    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
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par papajoker Voir le message
    bonjour

    Si la fenetre est bonne après resize, c'est que tu fais trop tôt ton calcul (ta fenêtre va s'ajuster au contenu après ). Il faut donc retarder au maximum ton replacement. Peut-être envoyer à la place un "event" qui va déclencher cette action de centrage.

    Mais je pense plus à une mauvaise conception : la fenêtre se cale sur ton label . Pas de sens, lorsque tu vas cliquer sur "suivant".
    Et du coups cela donnerait quoi dans mon code car j’utilise une QMainWindow et ensuite des widgets superposables que j'appelle lorsque je souhaite changer de template de page , le but étant que la dimension de la QmainWindow soit bonne pour l'affichage de tous les Widgets qui viennent eux même ce centrer dans la QMainWindow . Par ailleur que cette même taille de fênetre soit bonne peu importe la résolution de l’ordinateur qui exécutera mon programme

    Citation Envoyé par Sve@r Voir le message
    Mais je remarque que si j'inverse le show() et le move() là ça marche, le bouton est calé au centre de mon écran. Mais en retour la taille du bouton est ridicule (37, 25).
    On peut aussi rester en l'état, avec le move placé avant le show, et s'il faut un "resize()" pour fonctionner, alors tu peux écrire btn.resize(btn.size()). C'est con mais si c'est la seule solution...
    Du coups dans mon cas ce serait donc de faire quelque chose comme cela ?

    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
    class MainWindow(QMainWindow):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
             # set window properties
            self.setWindowTitle("Jeu de Piste Manon")
            self.resize(self.size())
     
     
     
            c=app.desktop().availableGeometry().center()
            self.move(c.x() - self.width() // 2, c.y() - self.height() // 2)
     
            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)
    Mais la encore j'obtiens exactement le même positionnement de fenêtre que lorsque je ne faisais pas de resize (colle au sud et très décalé a l'est : cf screen message précédent )

  12. #12
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 156
    Points : 4 570
    Points
    4 570
    Par défaut
    Mais, pourquoi tu n'affiches pas la taille avec un print() pour comprendre ce qui ce passe ??? dans ton init() et dans d'autres fonctions

    Pour moi ....
    - ton self.size(), puisque pas de composants, est très petit au début de init()
    - Tu fais ton move avec en calcul de cette mauvaise taille
    - En suite, tu crées tes contrôles (taille change), puis charge des datas dans tes contrôles (taille rechange ? A toi de faire des print() ). Il faut récupérer la taille uniquement à la fin pour faire le bon calcul/move()
    $moi= ( !== ) ? : ;

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 717
    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 717
    Points : 31 028
    Points
    31 028
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Maxcou Voir le message
    Du coups dans mon cas ce serait donc de faire quelque chose comme cela ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class MainWindow(QMainWindow):
    	def __init__(self, parent=None):
    		super(MainWindow, self).__init__(parent)
    		# set window properties
    		self.setWindowTitle("Jeu de Piste Manon")
    		self.resize(self.size())
    		c=app.desktop().availableGeometry().center()
    		self.move(c.x() - self.width() // 2, c.y() - self.height() // 2)
    Mais la encore j'obtiens exactement le même positionnement de fenêtre que lorsque je ne faisais pas de resize (colle au sud et très décalé a l'est : cf screen message précédent )
    Je conseillerais de faire le resize/move à la fin, quand le QMainWidget a été créé et rempli.

    Si je reprends mon code d'exemple en encapsulant le bouton dans un QMainWidget...
    Code python : 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
    #!/usr/bin/env python3
    # coding: utf-8
     
    # On importe les bibliothèques nécessaires
    from PyQt5.QtWidgets import *
    import sys
     
    def move():
    	f=pos.pop(0)
    	main.centralWidget().setText("%s: %s\ncenter=%s\nmain=%s\nbtn=%s" % (f[0], f[1], f[1].center(), main.size(), main.centralWidget().size()))
    	main.move((f[1].width() - main.width()) // 2, (f[1].height() - main.height()) // 2)
    	pos.append(f)
    # move()
     
    # L'application (élément de base)
    app=QApplication(sys.argv)
    pos=[
    	("available", app.desktop().availableGeometry()),
    	("screen", app.desktop().screenGeometry()),
    ]
     
    # Le QMainWindow
    main=QMainWindow()
    main.setCentralWidget(QPushButton(parent=main, clicked=move))
    main.resize(main.size())
    move()
    main.show()
     
    # Application
    sys.exit(app.exec_())
    Là encore ça fonctionne, le QMainWindow se trouve bien au centre de mon écran. Donc dans ton cas, repars du début, tu crées ton QMainWindow quasi-vide, tu l'affiches et tu checkes. Puis tu le remplis...

    Attention aussi à ne pas négliger la parenté quand tu crées des widget enfant. C'est ce qui permet à Qt de faire le lien (j'affiche truc, j'affiche alors tous les enfants de truc). Cf mon QPushButton widget central de mon QMainWindow. Et attention, "app" dans mon exemple ça le fait (j'ai assumé que cet exemple était écrit porc), pas dans ton cas où tu fais un projet "dans les règles" donc tu dois assumer les règles => pas de globales (oui ça ressemble au "faites ce que je dis pas ce que je fais" mais dans mes sources officiels postés sur ce forum tu verras que je respecte ce principe).
    En plus tu as à ta disposition une variable interne Qt nommée "qApp" qui reprend l'instance de l'application en cours. Sinon il y a la méthode statique QApplication.instance() (qApp disparait dans Qt6).

    Et force-toi à faire un héritage correct!!!
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class MainWindow(QMainWindow):
    	def __init__(self, *args, **kwargs):
    		super(MainWindow, self).__init__(*args, **kwargs)
    Dans ce cas ça ne doit pas jouer mais c'est une bonne habitude à prendre avant de se retrouver englué dans une mauvaise.
    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]

  14. #14
    Membre à l'essai
    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
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par papajoker Voir le message
    Mais, pourquoi tu n'affiches pas la taille avec un print() pour comprendre ce qui ce passe ??? dans ton init() et dans d'autres fonctions

    Pour moi ....
    - ton self.size(), puisque pas de composants, est très petit au début de init()
    - Tu fais ton move avec en calcul de cette mauvaise taille
    - En suite, tu crées tes contrôles (taille change), puis charge des datas dans tes contrôles (taille rechange ? A toi de faire des print() ). Il faut récupérer la taille uniquement à la fin pour faire le bon calcul/move()
    En effet ça semble logique j'ai donc decaler le rezise ainsi que le moove a la fin de ma fonction init .Mais en ayant fait mes prints au début de mon init QMainwindow et a la fin je récupère exactement les mêmes valeurs , ce n'est donc pas "normal "car entre temps je lui ai ajouter le QWidget ..
    Idem pour mon QWidget même valeur au début qu'a la fin de ma fonction init et je me retrouve donc avec la fenêtre encore dans le même état que si je n'avais pas resize .. J'avoue être vraiment perdu la ..

    Voici mes deux class que j'utilise pour le premier affichage :

    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
    class MainWindow(QMainWindow):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
             # set window properties
            self.setWindowTitle("Jeu de Piste Manon")
            print("debut init:" +str(self.size()))
     
     
     
     
            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)
            self.resize(self.size())
            c=app.desktop().availableGeometry().center()
            self.move(c.x() - self.width() // 2, c.y() - self.height() // 2)
            print("fin init:" +str(self.size()))
    A noter que même si je supprime la ligne 27 avec le resize(self.size()) , j'obtiens la même valeur a la fin ..

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    class Principale(QWidget):
        def __init__(self, parent=None):
            super(Principale, self).__init__(parent)
            #Initialise l'enigme a 1
            self.current_enigma= 1
            self.etape14 = 0
     
            print("debut principale:" +str(self.size()))
     
            # create label and set font
            self.label_réponse = QLabel("Entre ta réponse :")
            self.label_intitulé = QLabel("")
            self.label_resulat = QLabel("")
            self.label_created_by = QLabel("Created by Maxime")
              # create label for created by text and set font and alignment
     
            self.label_created_by.setFont(QFont("Times New Roman", 9))
            self.label_réponse.setFont(QFont("Arial", 12))
            self.label_intitulé.setFont(QFont("Times New Roman", 13,italic=True))
            self.label_resulat.setFont(QFont("Times New Roman", 12))
     
     
            # create text input field and set font
            self.text_input = QLineEdit()
            self.text_input.setFont(QFont("Arial", 20))
            self.text_input.setMaximumWidth(200)
     
            # create next button and set font and size
            self.next_button = QPushButton("Suivant")
            self.next_button.setFont(QFont("Arial", 12))
            self.next_button.setStyleSheet("background-color: green; color: white;")
            self.next_button.setMaximumWidth(100)
            self.next_button.clicked.connect(self.Suivant)
            self.text_input.returnPressed.connect(self.Suivant)
     
            # create previous button and set font and size
            self.prev_button = QPushButton("Précédent")
            self.prev_button.setFont(QFont("Arial", 12))
            self.prev_button.setStyleSheet("background-color: red; color: white;")
            self.prev_button.setMaximumWidth(100)
            self.prev_button.clicked.connect(self.Precedent)
     
     
     
            # set layout and add components
            self.vbox = QVBoxLayout()
            self.vbox.addWidget(self.label_intitulé, alignment=QtCore.Qt.AlignCenter)
            self.vbox.addWidget(self.label_réponse, alignment=QtCore.Qt.AlignCenter)
            self.vbox.addWidget(self.text_input, alignment=QtCore.Qt.AlignCenter)
            self.vbox.addWidget(self.label_resulat, alignment=QtCore.Qt.AlignCenter)
            hbox = QHBoxLayout()
            hbox.addWidget(self.prev_button, alignment=QtCore.Qt.AlignHCenter | QtCore.Qt.AlignBottom)
            hbox.addWidget(self.next_button, alignment=QtCore.Qt.AlignHCenter | QtCore.Qt.AlignBottom)
            self.vbox.addLayout(hbox)
            self.vbox.addWidget(self.label_created_by, alignment=QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight)
            self.setLayout(self.vbox)
     
            print("fin principale:" +str(self.size()))
     
            #initialisation du texte enigme + bouton
            self.set_enigma_text(self.current_enigma)
            self.actu_boutton()
    Et voila les print que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    debut init:PyQt5.QtCore.QSize(640, 480)
    debut principale:PyQt5.QtCore.QSize(100, 30)
    fin principale:PyQt5.QtCore.QSize(100, 30)
    fin init:PyQt5.QtCore.QSize(640, 480)

  15. #15
    Membre à l'essai
    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
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Sve@r Voir le message

    Attention aussi à ne pas négliger la parenté quand tu crées des widget enfant. C'est ce qui permet à Qt de faire le lien (j'affiche truc, j'affiche alors tous les enfants de truc). Cf mon QPushButton widget central de mon QMainWindow. Et attention, "app" dans mon exemple ça le fait (j'ai assumé que cet exemple était écrit porc), pas dans ton cas où tu fais un projet "dans les règles" donc tu dois assumer les règles => pas de globales (oui ça ressemble au "faites ce que je dis pas ce que je fais" mais dans mes sources officiels postés sur ce forum tu verras que je respecte ce principe).
    En plus tu as à ta disposition une variable interne Qt nommée "qApp" qui reprend l'instance de l'application en cours. Sinon il y a la méthode statique QApplication.instance() (qApp disparait dans Qt6).

    Et force-toi à faire un héritage correct!!!
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class MainWindow(QMainWindow):
    	def __init__(self, *args, **kwargs):
    		super(MainWindow, self).__init__(*args, **kwargs)
    Dans ce cas ça ne doit pas jouer mais c'est une bonne habitude à prendre avant de se retrouver englué dans une mauvaise.
    J'avoue ne pas suivre sur le fait que ma déclaration de classe ne soit pas correcte du point de vue des parents ? Il doit comporter deux arguments et non 1 seul ?
    Et pour ce qui est du début du message c'est ce que j'ai essayer et expliquer dans ma précédente réponse

  16. #16
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 717
    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 717
    Points : 31 028
    Points
    31 028
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Maxcou Voir le message
    J'avoue être vraiment perdu là ..
    D'autant plus que ton code fonctionne. Le mainWindow est bel et bien centré...
    Code python : 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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    #!/usr/bin/env python3
    # coding: utf-8
     
    # On importe les bibliothèques nécessaires
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    from PyQt5 import QtCore
    import sys
     
    class MainWindow(QMainWindow):
    	 def __init__(self, parent=None):
    		  super(MainWindow, self).__init__(parent)
    			# set window properties
    		  self.setWindowTitle("Jeu de Piste Manon")
    		  print("debut init:" +str(self.size()))
     
     
    		  self.central_widget = QStackedWidget()
    		  self.setCentralWidget(self.central_widget)
     
    		  self.principal = Principale(self)
    		  self.logo = QLabel()
    		  self.photo = QLabel()
    		  self.qr = QLabel()
    		  self.final = QLabel()
     
    		  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)
    		  self.resize(self.size())
    		  c=app.desktop().availableGeometry().center()
    		  print("center screen: ", c)
    		  self.move(c.x() - self.width() // 2, c.y() - self.height() // 2)
    		  print("fin init:" +str(self.size()))
     
    class Principale(QWidget):
    	 def __init__(self, parent=None):
    		  super(Principale, self).__init__(parent)
    		  #Initialise l'enigme a 1
    		  self.current_enigma= 1
    		  self.etape14 = 0
     
    		  print("debut principale:" +str(self.size()))
     
    		  # create label and set font
    		  self.label_réponse = QLabel("Entre ta réponse :")
    		  self.label_intitulé = QLabel("")
    		  self.label_resulat = QLabel("")
    		  self.label_created_by = QLabel("Created by Maxime")
    			 # create label for created by text and set font and alignment
     
    		  self.label_created_by.setFont(QFont("Times New Roman", 9))
    		  self.label_réponse.setFont(QFont("Arial", 12))
    		  self.label_intitulé.setFont(QFont("Times New Roman", 13,italic=True))
    		  self.label_resulat.setFont(QFont("Times New Roman", 12))
     
     
    		  # create text input field and set font
    		  self.text_input = QLineEdit()
    		  self.text_input.setFont(QFont("Arial", 20))
    		  self.text_input.setMaximumWidth(200)
     
    		  # create next button and set font and size
    		  self.next_button = QPushButton("Suivant")
    		  self.next_button.setFont(QFont("Arial", 12))
    		  self.next_button.setStyleSheet("background-color: green; color: white;")
    		  self.next_button.setMaximumWidth(100)
     
    		  # create previous button and set font and size
    		  self.prev_button = QPushButton("Précédent")
    		  self.prev_button.setFont(QFont("Arial", 12))
    		  self.prev_button.setStyleSheet("background-color: red; color: white;")
    		  self.prev_button.setMaximumWidth(100)
     
     
     
    		  # set layout and add components
    		  self.vbox = QVBoxLayout()
    		  self.vbox.addWidget(self.label_intitulé, alignment=QtCore.Qt.AlignCenter)
    		  self.vbox.addWidget(self.label_réponse, alignment=QtCore.Qt.AlignCenter)
    		  self.vbox.addWidget(self.text_input, alignment=QtCore.Qt.AlignCenter)
    		  self.vbox.addWidget(self.label_resulat, alignment=QtCore.Qt.AlignCenter)
    		  hbox = QHBoxLayout()
    		  hbox.addWidget(self.prev_button, alignment=QtCore.Qt.AlignHCenter | QtCore.Qt.AlignBottom)
    		  hbox.addWidget(self.next_button, alignment=QtCore.Qt.AlignHCenter | QtCore.Qt.AlignBottom)
    		  self.vbox.addLayout(hbox)
    		  self.vbox.addWidget(self.label_created_by, alignment=QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight)
    		  self.setLayout(self.vbox)
     
    		  print("fin principale:" +str(self.size()))
     
    		  #initialisation du texte enigme + bouton
     
    # L'application (élément de base)
    app=QApplication(sys.argv)
     
    # Le QMainWindow
    main=MainWindow()
    main.show()
     
    # Application
    sys.exit(app.exec_())
    Bon j'ai charcuté pas mal de trucs (partout où les éléments appelés n'étaient pas définis chez-moi) mais au résultat le QMainWindow apparait bel et bien centré dans mon écran.

    Citation Envoyé par Maxcou Voir le message
    J'avoue ne pas suivre sur le fait que ma déclaration de classe ne soit pas correcte du point de vue des parents ? Il doit comporter deux arguments et non 1 seul ?
    Déjà pour ces "deux arguments" tu noteras qu'ils ont des étoiles ce qui a une très grande importance. Plus de détails ici.
    Et pour l'héritage, un QMainWindow peut recevoir plus d'un argument. Or quand on crée un héritage on doit proposer un objet à minima identique à l'objet dont on hérite. Si je veux appeler ton MainWindow avec un Qt.WindowFlag comment je fais ?
    Ce qui amène l'utilisation de ces deux arguments spéciaux. Plus de détails dans ce chapitre.
    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]

  17. #17
    Membre à l'essai
    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
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    D'autant plus que ton code fonctionne. Le mainWindow est bel et bien centré...


    Bon j'ai charcuté pas mal de truc (partout où les éléments appelés n'étaient pas définis chez-moi) mais au résultat le QMainWindow apparait bel et bien centré dans mon écran.


    Déjà pour ces "deux arguments" tu noteras qu'ils ont des étoiles ce qui a une très grande importance. Plus de détails ici.
    Et pour l'héritage, un QMainWindow peut recevoir plus d'un argument. Or quand on crée un héritage on doit proposer un objet à minima identique à l'objet dont on hérite. Si je veux appeler ton MainWindow avec un Qt.WindowFlag comment je fais ?
    Ce qui amène l'utilisation de ces deux arguments spéciaux. Plus de détails dans ce chapitre.
    En effet , le code épuré comme tu l'as envoyé fonctionne parfaitement bien de mon coté, je vais donc devoir investiguer sur les causes de pourquoi dans mon code avec mes fonctions cela ne fonctionne plus .. J'ai également jeter un œil au lien que tu as envoyé et je vais changer la déclaration de mes classes une fois que j'aurai résolu ce fichu soucis de centrage .. Etant donner que le code fonctionne parfaitement bien sans les fonctions annexes de ma classe "Principale" , il apparait évident que le soucis vient de la !
    Encore merci du temps que tu accordes a ma résolution de problème !


    Edit j'ai vu que tu as remplacé les self du Mainwindow par des Qlabel , en effectuant ce changement dans mon programme j'ai déjà un meilleur centrage , pourquoi je ne sais pas encore , surement la taille des autres layouts créés dans les autres classes .. Le problème vient donc de la ligne 18/19/20 et 89 , en les commentant je n'ai plus l'intitulé de l''énigme(la methode pour le faire n'est plus appeler) mais ma fenetre est parfaitement centrée . Reste maintenant a savoir ce qui cloche

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    class MainWindow(QMainWindow):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
             # set window properties
            self.setWindowTitle("Jeu de Piste Manon")
            print("debut init:" +str(self.size()))
     
            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)
            self.resize(self.size())
            c=app.desktop().availableGeometry().center()
            self.move(c.x() - self.width() // 2, c.y() - self.height() // 2)
            print("fin init:" +str(self.size()))
     
    class Principale(QWidget):
        def __init__(self, parent=None):
            super(Principale, self).__init__(parent)
            #Initialise l'enigme a 1
            self.current_enigma= 1
            self.etape14 = 0
     
            print("debut principale:" +str(self.size()))
     
            # create label and set font
            self.label_réponse = QLabel("Entre ta réponse :")
            self.label_intitulé = QLabel("")
            self.label_resulat = QLabel("")
            self.label_created_by = QLabel("Created by Maxime")
              # create label for created by text and set font and alignment
     
            self.label_created_by.setFont(QFont("Times New Roman", 9))
            self.label_réponse.setFont(QFont("Arial", 12))
            self.label_intitulé.setFont(QFont("Times New Roman", 13,italic=True))
            self.label_resulat.setFont(QFont("Times New Roman", 12))
     
     
            # create text input field and set font
            self.text_input = QLineEdit()
            self.text_input.setFont(QFont("Arial", 20))
            self.text_input.setMaximumWidth(200)
     
            # create next button and set font and size
            self.next_button = QPushButton("Suivant")
            self.next_button.setFont(QFont("Arial", 12))
            self.next_button.setStyleSheet("background-color: green; color: white;")
            self.next_button.setMaximumWidth(100)
            self.next_button.clicked.connect(self.Suivant)
            self.text_input.returnPressed.connect(self.Suivant)
     
            # create previous button and set font and size
            self.prev_button = QPushButton("Précédent")
            self.prev_button.setFont(QFont("Arial", 12))
            self.prev_button.setStyleSheet("background-color: red; color: white;")
            self.prev_button.setMaximumWidth(100)
            self.prev_button.clicked.connect(self.Precedent)
     
     
     
            # set layout and add components
            self.vbox = QVBoxLayout()
            self.vbox.addWidget(self.label_intitulé, alignment=QtCore.Qt.AlignCenter)
            self.vbox.addWidget(self.label_réponse, alignment=QtCore.Qt.AlignCenter)
            self.vbox.addWidget(self.text_input, alignment=QtCore.Qt.AlignCenter)
            self.vbox.addWidget(self.label_resulat, alignment=QtCore.Qt.AlignCenter)
            hbox = QHBoxLayout()
            hbox.addWidget(self.prev_button, alignment=QtCore.Qt.AlignHCenter | QtCore.Qt.AlignBottom)
            hbox.addWidget(self.next_button, alignment=QtCore.Qt.AlignHCenter | QtCore.Qt.AlignBottom)
            self.vbox.addLayout(hbox)
            self.vbox.addWidget(self.label_created_by, alignment=QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight)
            self.setLayout(self.vbox)
     
            print("fin principale:" +str(self.size()))
     
            #initialisation du texte enigme + bouton
           # self.set_enigma_text(self.current_enigma)
            self.actu_boutton()

  18. #18
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 717
    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 717
    Points : 31 028
    Points
    31 028
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Maxcou Voir le message
    En effet , le code épuré comme tu l'as envoyé fonctionne parfaitement bien de mon coté, je vais donc devoir investiguer sur les causes de pourquoi dans mon code avec mes fonctions cela ne fonctionne plus ..
    Exactement ce que j'ai dit hier "Donc dans ton cas, repars du début, tu crées ton QMainWindow quasi-vide, tu l'affiches et tu checkes. Puis tu le remplis..."

    Citation Envoyé par Maxcou Voir le message
    Edit j'ai vu que tu as remplacé les self du Mainwindow par des Qlabel , en effectuant ce changement dans mon programme j'ai déjà un meilleur centrage , pourquoi je ne sais pas encore , surement la taille des autres layouts créés dans les autres classes .. Le problème vient donc de la ligne 18/19/20 et 89 , en les commentant je n'ai plus l'intitulé de l''énigme(la methode pour le faire n'est plus appeler) mais ma fenetre est parfaitement centrée . Reste maintenant a savoir ce qui cloche
    Oui j'ai mis des QLabel parce qu'il fallait un truc Qt (j'avais tenté QImage mais cet objet ne convenait pas à l'utilisation que tu en fais ensuite).
    Une piste à creuser (déjà évoqué): la parentée Qt. C'est un point super important et d'après tes exemples tu ne le prends absolument pas en considération. Or c'est la parenté qui permet à Qt d'associer les éléments entre eux. Si dans une classe tu as par exemple 3 Qtrucs, la taille (à l'écran) de la classe sera dépendante de la taille de ces trucs, mais à condition que Qt sache que la classe contient des trucs => parenté.
    Ici un exemple qui introduit la notion de parenté. Tu peux le récupérer et tester. Remplace par exemple btn=QPushButton("Quit", parent=wid) par btn=QPushButton("Quit") et tu verras l'importance de cette notion.
    A partir de là, tous les exemples qui suivront garderont toujours cette parenté toujours omniprésente.
    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]

+ 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