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 :

PyQt - widget qui ne s'affiche pas complètement


Sujet :

PyQt Python

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut PyQt - widget qui ne s'affiche pas complètement
    Bonjour,

    J'essaye d'écrire un widget, voici le code :

    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
    import sys
    from PyQt5.QtWidgets import (QApplication, QWidget, QLabel, QSpinBox, QGridLayout)
    from PyQt5.QtGui import QPixmap, QTransform, QPainter, QPen
    from PyQt5.QtCore import Qt
     
    class CameraWidget(QWidget):
     
        def __init__(self, parent=None):
            super(CameraWidget, self).__init__(parent)
     
            self.im = QPixmap("./23794_50.png")
            self.angle_min = -45
            self.angle_max = 45
     
            self.angle = 0
     
            self.diag = (self.im.width()**2 + self.im.height()**2)**0.5
     
            self.label = QLabel()
            self.label.setFixedSize(self.diag, self.diag)
            self.label.setAlignment(Qt.AlignCenter)
            self.label.setPixmap(self.im)
     
            self.spin = QSpinBox()
            self.spin.setMinimum(self.angle_min)
            self.spin.setMaximum(self.angle_max)
            self.spin.valueChanged.connect(self.update)
     
            self.grid = QGridLayout()
     
            self.grid.addWidget(self.label, 0, 1)
            self.grid.addWidget(self.spin, 1, 1)
     
            self.setLayout(self.grid)
            self.update()
     
     
        def update(self):
     
            pixmap = self.im
            self.rotation = self.spin.value()
     
            transform = QTransform().rotate(self.rotation)
            pixmap = pixmap.transformed(transform, Qt.SmoothTransformation)
     
            self.label.setPixmap(pixmap)
     
     
        def paintEvent(self, event):
            painter = QPainter(self)
     
            pen = QPen()
            pen.setWidth(3)
            pen.setColor(Qt.blue)
     
            painter.setPen(pen)
            painter.drawEllipse(int(self.diag/2) - 11, int(self.diag/2) - 25, self.diag, self.diag)
     
     
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        cam = CameraWidget()
        cam.setWindowTitle("PyQT show image")
        cam.show()
        sys.exit(app.exec_())
    Ca fonctionne quand je lance ce code. (c'est un label dans lequel je met une image, je trace un cercle qui entoure l'image, et un spinBox. Quand je clique sur le spinBox, l'image tourne d'un angle correspondant à la valeur du spinBox)

    Mais quand je l'intègre dans une interface avec d'autres widget, j'ai le spinBox qui s'affiche, mais pas le label et le cercle dessiné.
    Qu'est ce qu'il manque?

    Merci,
    Nico

  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 690
    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 690
    Points : 30 984
    Points
    30 984
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par DiverSIG Voir le message
    Qu'est ce qu'il manque?
    Il faudrait voir comment tu appelles l'objet "CameraWidget" et surtout le parent que tu lui donnes car ça peut venir de là. En effet la parenté d'un widget c'est super important pour que Qt sache à qui il appartient pour pouvoir l'afficher correctement quand il affiche le widget père.

    Déjà voici comment j'écris tous les constructeurs de mes classes qui héritent d'un objet Qt
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class CameraWidget(QWidget):
    	def __init__(self, *args, **kwargs):
    		super().__init__(*args, **kwargs)
    Ainsi ça me permet d'appeler CameraWidget() depuis n'importe quoi avec tous les paramètres que peut accepter un QWidget (y compris le paramètre "parent=") et je sais que ces paramètres seront bien tous passés au QWidget, et non pas uniquement le paramètre "parent" comme dans ton code.

    Ensuiite, les widgets internes sont toujours associés à l'objet dans lequel ils sont créés. Ainsi le QLabel sera écrit self.label = QLabel(parent=self) et pareil pour le QSpinBox qui sera écrit self.spin = QSpinBox(parent=self). Pareil pour le Layout qui deviendra grid=QGridLayout(self) ce qui évite de devoir appeler self.setLayout() puisque le layout est déjà associé au self (et pas besoin non plus d'en faire un attribut de l'objet puisqu'il n'est pas réutilisé dans une autre méthode). Accessoirement on est en droit de se demander pourquoi un GridLayout pour seulement deux widgets placés l'un au dessous de l'autre (à la mauvaise colonne en plus car la première colonne d'un GridLayout c'est 0) alors qu'un VBoxLayout serait largement suffisant.
    Tu peux aussi remplacer setMinimum() et setMaximum() par setRange() et de même les angles min et max n'ont pas besoin d'être attributs (d'autant plus que tu peux ensuite les retrouver via le SpinBox si nécessaire).
    Et il y a encore un défaut car chez-moi la photo n'est pas au centre du cercle (faut que je change la taille de la fenêtre pour arriver à placer la photo au centre) mais ça reste du détail mathématique.
    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
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    J'ai modifié le code avec ceci :
    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
    class CameraWidget(QWidget):
     
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
     
            self.im = QPixmap("./23794_50.png")
     
            self.angle = 0
     
            self.diag = (self.im.width()**2 + self.im.height()**2)**0.5
     
            self.label = QLabel(parent=self)
            self.label.setFixedSize(self.diag, self.diag)
            self.label.setAlignment(Qt.AlignCenter)
            self.label.setPixmap(self.im)
            self.label.setStyleSheet("border: 1px solid black;")
     
            self.spin = QSpinBox(parent=self)
            self.spin.setRange(-45, 45)
            self.spin.valueChanged.connect(self.update)
     
            self.layout = QVBoxLayout(self)
     
            self.layout.addWidget(self.label)
            self.layout.addWidget(self.spin)
     
            self.setLayout(self.layout)
            self.update()
     
     
        def update(self):
     
            pixmap = self.im
            self.rotation = self.spin.value()
     
            transform = QTransform().rotate(self.rotation)
            pixmap = pixmap.transformed(transform, Qt.SmoothTransformation)
     
            self.label.setPixmap(pixmap)
     
     
        def paintEvent(self, event):
            painter = QPainter(self)
     
            pen = QPen()
            pen.setWidth(3)
            pen.setColor(Qt.blue)
     
            painter.setPen(pen)
            painter.drawEllipse(int(self.diag/2) - 11, int(self.diag/2) - 11, self.diag, self.diag)

    Je suis obligé de garder l'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.setLayout(self.layout)
    sinon, mes 2 widgets se calent en haut à gauche de la fenêtre

    Quand j'intègre ça dans ma page, je n'ai toujours que le spinbox qui s'affiche


    Nico

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    Je soupçonne un problème d'écran 4K :
    - si je remplace le label avec l'image pixmap par un label avec du simple texte, tout s'affiche correctement.

    Nico

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/07/2015, 10h53
  2. [XL-2007] Cliquer sur un lien a href dans un code source (qui ne s'affiche pas complètement)
    Par GuillaumeMorel dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 26/05/2014, 10h03
  3. [AC-2003] Sous-État qui ne s'affiche pas complètement ?
    Par marot_r dans le forum IHM
    Réponses: 0
    Dernier message: 03/02/2010, 17h57
  4. [debutant][Tomcat]Images qui ne s'affichent pas
    Par omega dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 07/04/2004, 09h44
  5. [MFC] Ces fenêtres qui ne s'affichent pas..
    Par Davide dans le forum MFC
    Réponses: 3
    Dernier message: 19/11/2003, 11h30

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