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 :

Redimensionner une MainWindow [QtGui]


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 11
    Par défaut Redimensionner une MainWindow
    Bonjour,
    Je bloque que un problème qui semble "tout bête"...
    J'ai un programme en PyQt4 qui affiche les images d'une webcam avec OpenCV. Tout fonctionne plutôt bien mais.. au moment de changer la résolution :
    - de 320x240 vers 640x480, la MainWindow s'agrandit, bien.
    - de 640x480 vers 320x240, la MainWindow ne s'ajuste pas à la taille du QLabel, et conserve sa grande taille.
    Voici un exemple qui simule ma fenêtre principale:
    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
    # -*- coding: utf-8 -*-
     
    from PyQt4 import QtCore, QtGui
     
    class Ui_MainWindow(QtGui.QMainWindow):
     
        def setupUi(self, MainWindow): 
            self.labelImage = QtGui.QLabel(MainWindow)
            self.labelImage.setGeometry(QtCore.QRect(0, 0, 320, 240))
            self.size1()
            MainWindow.setCentralWidget(self.labelImage)         
            self.action1 = QtGui.QAction(self)
            self.action1.setText("320")
    	self.action2 = QtGui.QAction(self)
    	self.action2.setText("640")
    	self.toolBar = QtGui.QToolBar(MainWindow)
            self.toolBar.addAction(self.action1)
    	self.toolBar.addAction(self.action2)
            MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
    	self.connect(self.action1, QtCore.SIGNAL("triggered()"),self.size1)
    	self.connect(self.action2, QtCore.SIGNAL("triggered()"),self.size2)
     
        def size1(self):	
    	pixmap=QtGui.QPixmap(320,240)
    	pixmap.fill()
    	self.labelImage.setPixmap(pixmap)
    	#self.labelImage.resize(320,240)
    	self.adjustSize()
     
        def size2(self):
    	self.sh=self.size()
    	pixmap=QtGui.QPixmap(640,480)
    	pixmap.fill()
    	self.labelImage.setPixmap(pixmap)
    	#self.labelImage.resize(640,480)
    	#self.adjustSize()
     
     
    if __name__ == "__main__":
        import sys
        app = QtGui.QApplication(sys.argv)
        MainWindow = QtGui.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    J'ai tenté pas mal d'astuces : resize, adjustSize, sizeHint, minimumSize, maximumSize, utiliser un layout.... mais je n'arrive à rien.
    Quelqu'un peut-il m'aider ??
    Merci par avance

  2. #2
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Essaye de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        def setupUi(self, MainWindow):
            MainWindow.resize(320, 240))
            self.central_widget = QtGui.QWidget(MainWindow)
            self.grid = QtGui.QGridLayout(self.central_widget)
            self.labelImage = QtGui.QLabel(self.central_widget)
            self.grid.addWidget(self.labelImage, 0, 0, 1, 1)
            self.size1()
            MainWindow.setCentralWidget(self.central_widget)
    Si ça n'a pas l'effet escompté, il faudra passer par les resize event.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 11
    Par défaut
    Bonsoir et merci pour ta réponse,
    J'ai essayé ton code avec le GridLayout mais sans succès... (j'avais aussi essayé avec un VBoxLayout) et j'ai aussi essayé de réassigner les resize event, mais rien ne se passe, même pas en redimensionnant manuellement la fenêtre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def resizeEvent(self, event):
    	print self.size()
    Comprends pas....


    PS : J'ai déjà testé oqapy et paQager et j'utilise souvent Qarte, merci !

  4. #4
    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,

    Juste une idée.

    Si j'ai bien compris, la fenêtre refuse de se réduire si cela a pour conséquence de diminuer l'image inscrite dans le label. Si c'est ça, ça me parait normal, parce que le QLabel ne doit pas savoir comment redimensionner son contenu. Et comme il n'a pas d'ascenseur, il ne lui laisse que le refus.

    J'ai fait un petit test. Voici une fenêtre ne contenant qu'un QLabel ne contenant rien, mais redimensionné à 640 x 480. Pour qu'on voit bien l'emplacement du QLabel, j'ai mis son fond en jaune:

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
    # python 2.7
     
    import sys
    from PyQt4 import QtCore,QtGui
     
    #############################################################################
    class Fenetre(QtGui.QMainWindow):
        def __init__(self, parent=None):
            super(Fenetre,self).__init__(parent)
     
            self.label = QtGui.QLabel(u"", self)
            self.label.resize(640,480)
            self.label.setStyleSheet("background-color:yellow")
     
            self.setCentralWidget(QtGui.QFrame())
            posit = QtGui.QGridLayout()
            posit.addWidget(self.label, 0, 0)
            self.centralWidget().setLayout(posit)
     
    #############################################################################
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    Avec cette fenêtre, rien n'empêche le redimensionnement dans les 2 sens.

    Maintenant, on ajoute à la fin du __init__ ces lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            pixmap = QtGui.QPixmap(640,480)
            pixmap.fill()
            self.label.setPixmap(pixmap)
    Avec cet ajout, la fenêtre accepte d'être agrandie, mais pas diminuée.

    Si j'ai raison, il suffira de surcharger la méthode recevant l'évènement de redimensionnement du QLabel, et de traiter dedans les changements de taille de l'image ou de la vidéo pour que le QLabel accepte de suivre

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 11
    Par défaut
    Bonsoir,
    En fait, ce n'est pas tout à fait le soucis mais merci BEAUCOUP car ton exemple m'a permis de trouver l'erreur.
    Je vais tenter d'expliquer (même si je manque de vocabulaire) ça peut toujours servir...
    J'ai utilisé QtDesigner et pyuic4 -x pour produire un "exécutable". Du coup le widget et les évènements ne doivent visiblement pas être bien initialisés.
    C'est pour ça que le resizeEvent ne donne rien.
    Voici un code qui marche :
    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
    # -*- coding: utf-8 -*-
     
    from PyQt4 import QtCore, QtGui
     
    class MainWindow(QtGui.QMainWindow):
     
    	def __init__(self):
    		QtGui.QMainWindow.__init__(self)
    		self.labelImage = QtGui.QLabel(self)
    		self.labelImage.setGeometry(QtCore.QRect(0, 0, 320, 240))
    		self.size1()
    		self.setCentralWidget(self.labelImage)         
    		self.action1 = QtGui.QAction(self)
    		self.action1.setText("320")
    		self.action2 = QtGui.QAction(self)
    		self.action2.setText("640")
    		self.toolBar = QtGui.QToolBar(self)
    		self.toolBar.addAction(self.action1)
    		self.toolBar.addAction(self.action2)
    		self.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
    		self.connect(self.action1, QtCore.SIGNAL("triggered()"),self.size1)
    		self.connect(self.action2, QtCore.SIGNAL("triggered()"),self.size2)
     
    	def size1(self):	
    		pixmap=QtGui.QPixmap(320,240)
    		pixmap.fill()
    		self.labelImage.setPixmap(pixmap)
    		self.adjustSize()
     
    	def size2(self):
    		self.sh=self.size()
    		pixmap=QtGui.QPixmap(640,480)
    		pixmap.fill()
    		self.labelImage.setPixmap(pixmap)
    		self.adjustSize()
     
    	def resizeEvent(self, event):
    		print self.size()
     
    if __name__ == "__main__":
        import sys
        app = QtGui.QApplication(sys.argv)
        win = MainWindow()
        win.show()
        sys.exit(app.exec_())
    Dans mon code précédent, il n'y avait qu'une méthode setupUi(), il manquait l' "initialiseur" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def __init__(self):
    		QtGui.QMainWindow.__init__(self)
    Maintenant, je pense que les resizeEvent s'effectuent bien et donc adjustSize() a une valeur de size() pour travailler...

    Merci à vous deux !

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

Discussions similaires

  1. Redimensionner une JList en largeur
    Par billyboy dans le forum Composants
    Réponses: 3
    Dernier message: 06/06/2004, 17h48
  2. (MFC) Redimensionner une List Control auto / Boite Dlg
    Par Guybrush113 dans le forum MFC
    Réponses: 7
    Dernier message: 23/04/2004, 09h24
  3. [Applet]Redimensionner une applet
    Par muad'dib dans le forum Applets
    Réponses: 2
    Dernier message: 22/04/2004, 12h42
  4. [MX2004] redimensionner une image lors du chargement
    Par ouinouin dans le forum Flash
    Réponses: 8
    Dernier message: 18/02/2004, 18h32
  5. Redimensionner une ToolBar
    Par tscoops dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/11/2003, 16h46

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