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 :

[newbie] Problème de dimension d'une fenêtre affichant une image


Sujet :

PyQt Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 51
    Points : 20
    Points
    20
    Par défaut [newbie] Problème de dimension d'une fenêtre affichant une image
    Bonjour,

    nouveau sur PyQt, j'ai besoin d'une librairie graphique pour un projet dans lequel je dois récupérer les coordonnées de lignes dessinées par dessus une image par l'utilisateur, coordonnées relatives à la position sur l'image (c'est un projet de géométrie projective pour ceux que ça intéresse).
    L'utilisateur peut aussi choisir l'image d'arrière plan qui peut avoir des dimensions différentes à tout moment.

    Pour le moment j'ai créé une classe QWidget qui contient un QLabel auquel j'ai assigné un objet QPixmap, la fenêtre principale contient une toolbar avec un bouton pour lancer un une fenêtre de dialogue permettant de charger une image dans le label du widget.
    Le truc c'est que si je charge une grande image puis une plus petite, la fenêtre reste grande (même trop si les dimensions de l'image dépasse celle de l'écran, et le label n'est pas redimensionné, je m'en suis apperçu en via l'évênement mousepress capté par le widget.

    Comme c'est un projet à faire assez rapidement et que je n'ai pas connaissance de toute la librairie PyQt je me permet de faire appel à vos conseil pour l'implémentation d'un tel programme.
    Merci.

    Edi: Une chose que je n'explique pas c'est que si je fait remplace le QWidget par une extension de QLabel directement, j'ai resize() le QLabel aux dimension de size() du QPixmap, en affichant la taille du QLabel je vois que celle-ci change bien, pourtant lorsque je clique partout dans la fenêtre l'évênement mousepressed du QLabel se déclenche, même dans des zones à priori hors du QLabel redimensionné....

    Voici le code en question :
    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
     
    class DrawLabel(QLabel):
     
        def __init__(self, img="img/tux.png"):
            super().__init__()
            self.initUI(img)
     
     
        def initUI(self, img):      
            # Image label initialization
            self.pixmap = QPixmap(img)
            self.setPixmap(self.pixmap)
            self.onLine = False
     
        def setImg(self, img):
            self.pixmap = QPixmap(img)
            #self.resize(self.pixmap.size())
            self.setPixmap(self.pixmap)
            #self.resize(self.sizeHint())
            print("DIMENSION: ", self.pixmap.size())
            print("LABEL SIZE: ", self.size())
     
        def mousePressEvent(self, event):
            self.onLine = not self.onLine
            self.lineOrigin = QCursor.pos()
            print(self.lineOrigin)
     
     
     
    class App(QMainWindow):
        def __init__(self):
            super().__init__()
     
            self.initUI()
     
     
        def initUI(self):               
            # toolbar initialization
            exitAction = QAction(QIcon('exit24.png'), 'Exit', self)
            exitAction.setShortcut('Ctrl+Q')
            exitAction.triggered.connect(qApp.quit)
     
            self.toolbar = self.addToolBar('Exit')
            self.toolbar.addAction(exitAction)
     
            loadimgAction = QAction(QIcon('img/loadimg.png'), 'Load Picture', self)
            loadimgAction.setShortcut('Ctrl+L')
            loadimgAction.triggered.connect(self.loadImg)
     
            self.toolbar = self.addToolBar('Load picture')
            self.toolbar.addAction(loadimgAction)
     
            self.drawlbl = DrawLabel()
            self.setCentralWidget(self.drawlbl)
            # Window initialization
            self.setGeometry(300, 300, 300, 200)
            self.setWindowTitle('Progeo')
            self.show()
     
        def loadImg(self):
            filename, _ = QFileDialog.getOpenFileName(self, 'Load image file', '.', 
                    "Images (*.png *.xpm *.jpg)")
            self.drawlbl.setImg(filename)
            self.resize(self.sizeHint())
     
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ex = App()
        sys.exit(app.exec_())

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Salut,

    Le QLabel n'est pas du tout destiné à cela.

    Utilise plutôt un QGraphicsView où tu pourras gérer le plus simplement du monde les questions de dimensions d'image et, puisque tu en fais état, les surcharges de dessin par dessus l'image.

    Un tuto sur DVP

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 51
    Points : 20
    Points
    20
    Par défaut repérer les coordonnées sur l'image
    Super, merci.
    QGraphicsView est le widget de la situation !

    Par contre une chose que je n'ai toujours pas résolu : Le QPixmap ne remplit pas toujours totalement le QGraphicsView, ce qui est peu pratique pour repérer les coordonnées sur l'image.

    Comment je peux régler cela ?

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    L'image peut être redimensionnée avec la méthode scaled mais il faut voir si tu veux conserver le rapport largeur hauteur, c'est le cas en général si il s'agit de photo, dans ce cas ce ne sera probablement pas le même rapport que celui de la fenêtre graphique.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 51
    Points : 20
    Points
    20
    Par défaut
    Merci de ta réponse, j'ai déja réalisé cela justement grâce au tuto avec la fonction open_image

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        def open_image(self, path):
            w_vue, h_vue = self.view.width(), self.view.height() 
            self.current_image = QImage(path)
            self.pixmap = QPixmap.fromImage(self.current_image.scaled(w_vue, h_vue,
                Qt.KeepAspectRatio, 
                Qt.SmoothTransformation))
    Le truc c'est que l'image se met à l'échelle par rapport à la plus petite coordonnée du QGraphicsView, et cela laisse parfois deux rectangles de part et d'autre de l'image vide, mais la zone appartient au QGraphicsView.
    Comme j'aimerais récupéré les coordonnées des clics seulement sur l'image ces zones vides sont problématiques...
    Je récupère les évênements mousepressed depuis QGraphicsView, à moins qu'on ne puisse le faire depuis QPixmap ? Mais je ne suis pas sur que ce soit un widget.

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Tout est prévu dans Qt. Tu peux directement connaître les coordonnées scene, donc image, à partir des coordonnées vue.

    Considérons que ton QGraphicsView s'appelle qview et ton événement click s'appelle event
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    image_coord = qview.mapToScene(event.pos())

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 51
    Points : 20
    Points
    20
    Par défaut
    C'est exactement ce quer je cherchais, merci !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/03/2015, 21h19
  2. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  3. Afficher une fenêtre depuis une DLL
    Par swayvill dans le forum VC++ .NET
    Réponses: 3
    Dernier message: 05/04/2007, 19h14
  4. Réponses: 4
    Dernier message: 26/01/2007, 07h39
  5. Afficher une fenêtre depuis une DLL
    Par swayvill dans le forum C++
    Réponses: 1
    Dernier message: 07/01/2007, 16h43

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