Partage
  • Partager sur Facebook
  • Partager sur Twitter

PyQt5 créer un dessin QPainter dans un frame

Sujet résolu
    12 octobre 2021 à 10:50:39

    Bonjour,

    Je débute avec PyQt et j'ai du mal à comprendre la logique de QPainter.

    Je souhaite positionner un dessin (ici un rectangle tout simple) au milieu d'une page avec un Labe au dessus et un bouton en dessous. J'ai donc intégré tous ces éléments avec QVBoxLayout et là ou je souhaite mettre mon dessin, j'ai créé un Qframe rectangle.

    Le problème est lorsque je créé le QPainter dans paintEvent quand je le lie à la fenetre : Qpaint(self) le rectangle apparaît mais pas indépendamment des autres objets et lorsque je le lie au frame : QPaiint(self.cadre) rien n'apparait.

    Si quelqu'un a une solution.

    Merci d'avance

    Jef

    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QSlider, QVBoxLayout, QLabel, QFrame
    from PyQt5.QtGui import QPainter, QPen, QBrush
    from PyQt5.QtCore import Qt, QRect
    
    
    class jauge(QWidget):
        def __init__(self):
            super().__init__()
            self.setGeometry(100,100, 600,300)
            #creation de la boite modèle verticale
            self.vBoxLayout = QVBoxLayout(self)
            #creation de tris objets un label, un cadre (frame) et un bouton
            self.label = QLabel(self)
            self.label.setText("essai de dessin")
            self.vBoxLayout.addWidget(self.label)
            self.test = QWidget(self)
            self.cadre = QFrame(self.test)
            #self.cadre.resize(200,200)
            #self.cadre.setStyleSheet("background-color: rgb(200, 255, 255)")
            self.vBoxLayout.addWidget(self)
            self.bouton = QPushButton(self)
            self.bouton.setText("boutton test")
            self.vBoxLayout.addWidget(self.bouton)
    
        def paintEvent(self, Event):
            print(self.rect())
            painter = QPainter(self.cadre)
            painter.setPen(QPen(Qt.black, 5, Qt.SolidLine))
            painter.drawRect(50, 50, 200, 200)
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        test = jauge()
        test.show()
        sys.exit(app.exec_())



    • Partager sur Facebook
    • Partager sur Twitter
      12 octobre 2021 à 18:29:58

      il faut redéfinir la méthode paintEvent de QFrame (donc créer une QFrame custom)

      import sys
      from PyQt5 import QtCore, QtGui, QtWidgets
      from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QSlider, QVBoxLayout, QLabel, QFrame
      from PyQt5.QtGui import QPainter, QPen, QBrush
      from PyQt5.QtCore import Qt, QRect
      
      class myQFrame(QFrame):
          def paintEvent(self, Event):
              print(self.rect())
              painter = QPainter(self)
              painter.setPen(QPen(Qt.black, 5, Qt.SolidLine))
              painter.drawRect(50, 50, 200, 200)
       
       
      class jauge(QWidget):
          def __init__(self):
              super().__init__()
              self.setGeometry(100,100, 600,300)
              #creation de la boite modèle verticale
              self.vBoxLayout = QVBoxLayout(self)
              #creation de tris objets un label, un cadre (frame) et un bouton
              self.label = QLabel(self)
              self.label.setText("essai de dessin")
              self.vBoxLayout.addWidget(self.label)
              self.test = QWidget(self)
              self.cadre = myQFrame(self.test)
              #self.cadre.resize(200,200)
              #self.cadre.setStyleSheet("background-color: rgb(200, 255, 255)")
              self.vBoxLayout.addWidget(self.cadre)
              self.bouton = QPushButton(self)
              self.bouton.setText("boutton test")
              self.vBoxLayout.addWidget(self.bouton)
       
       
      if __name__ == "__main__":
          app = QApplication(sys.argv)
          test = jauge()
          test.show()
          sys.exit(app.exec_())


      PS: correction de la ligne 29 au passage, on passe sefl.cadre au VBoxLayout

      • Partager sur Facebook
      • Partager sur Twitter
        13 octobre 2021 à 8:05:33

        Merci Umfred,

        Ca marche et j'ai mieux intégrer le fonctionnement de cette fonction paintEvent

        Jef

        • Partager sur Facebook
        • Partager sur Twitter

        PyQt5 créer un dessin QPainter dans un frame

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown