Partage
  • Partager sur Facebook
  • Partager sur Twitter

[pyQt]creer un signal

Sujet résolu
    11 août 2008 à 16:20:18

    Bonjour,
    Je suis en train de developper un programme en python, avec pyQt, mais je n'arrive pas a creer de slot.
    En gros j'ai une classe QGraphicItem, placer dans un QGraphicsScene, placer dans un QGraphicsViews.
    Ma classe qui hérite de QGraphicItem a setFlag(ItemIsMovable), donc avec ca je peu deplacer à la sourie sur ma scene.
    Ce que je veux faire, c'est créer un signal qui ai envoyer des que je bouge mon item. Ce que j'ai essayé de faire, c'est lors de l'appel de la fonction paint de mon item, qui est appelé à chaque fois que mon item est bougé à la sourie, j'ai écrit :
    self.emit(QtCore.SIGNAL("posChanged()"))
    Mais quand j'execute mon programme, ça me dit qu'il ne connait pas l'attribut emit.
    Quelqu'un sait la syntaxe exacte, ou ce qu'il faut que je fasse pour que ça fonctionne ?

    merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      11 août 2008 à 17:03:56

      Ba je suis pas sur, ne m'en veut pas si je me trompe, mais il n'y aurait pas une autre fonction du genre

      self.emit(QtCore.SIGNAL("posChanged()"), item)
      


      En plus Qt c'est pas mon fort, mais j'ai l'impression qui manque quelquechose

      :euh:
      • Partager sur Facebook
      • Partager sur Twitter
        11 août 2008 à 19:03:38

        Hum... j'ai pas tout compris, quand tu tapes self.emit(QtCore.SIGNAL("posChanged()")), tu es dans une classe qui hérite de quoi ?
        • Partager sur Facebook
        • Partager sur Twitter
          11 août 2008 à 21:37:58

          Citation : fred1599

          Ba je suis pas sur, ne m'en veut pas si je me trompe, mais il n'y aurait pas une autre fonction du genre


          Je crois pas, l'erreur ne provient pas du nombre d'argument, mais il m'affiche ça comme message d'erreur, il ne connait pas emit je crois :


          Traceback (most recent call last):
          File "G:\ecole\ArcelorMittal\python\projet\projet07(decoupeur d'image 2)\Graphic.py", line 40, in paint
          self.emit(QtCore.SIGNAL("posChanged()"))
          AttributeError: emit

          Citation : nicknick63

          Hum... j'ai pas tout compris, quand tu tapes self.emit(QtCore.SIGNAL("posChanged()")), tu es dans une classe qui hérite de quoi ?



          Ma classe hérite de QGraphicsItem qui hérite de QObject. Voici le fichier de ma classe ou j'ai un problème :

          #!/usr/bin/env python
          
          import sys ## pour tester
          from PyQt4 import QtCore, QtGui
          import Image, ImageQt
          
          
          # Module logiciel
          import Fonction
          
          
          class Rectangle(QtGui.QGraphicsItem):
          
          
              def __init__(self, x, y, parent = None):
                  QtGui.QGraphicsItem.__init__(self, parent)
                  self.x = x
                  self.y = y
                  self.setFlag(QtGui.QGraphicsItem.ItemIsMovable)
                  self.setCursor(QtCore.Qt.SizeAllCursor)
                  
                  
              def boundingRect(self):
                  return QtCore.QRectF(0, 0, self.x, self.y)
                  
                  
              def paint(self, painter, option, widget):
                  painter.setBrush(QtCore.Qt.NoBrush)
                  painter.setPen(QtCore.Qt.darkGreen)
                  painter.drawRect(0, 0, self.x, self.y)
                  self.emit(QtCore.SIGNAL("posChanged()")) ##C'est ici qu'il y a un problème
                  
                  
              def modifX(self, x):
                  self.x = x
                  self.update()
                  
                  
              def modifY(self, y):
                  self.y = y
                  self.update()
                  
          
          
          
          
          
          
          class ImageGraph(QtGui.QGraphicsItem):
          
              def __init__(self, pathImage, contraste):
                  QtGui.QGraphicsItem.__init__(self)
                  self.pathImage = pathImage
                  self.contraste = contraste
                  if pathImage != "":
                      self.imagePIL = Image.open(str(pathImage))
                      self.imagePILx ,self.imagePILy = self.imagePIL.size
                      self.imagePILcont = Fonction.contraster(self.imagePIL, self.contraste)
                      self.imagePixmap = QtGui.QPixmap.fromImage(ImageQt.ImageQt(self.imagePILcont))
                  else:
                      self.imagePixmap = QtGui.QPixmap(512,512)
                  
              def boundingRect(self):
                  if self.pathImage != "":
                      return QtCore.QRectF(0, 0, self.imagePILx, self.imagePILy)
                  else:
                      return QtCore.QRectF(0, 0, 512,512)
              
              def paint(self, painter, option, widget):
                  painter.drawPixmap(0, 0, self.imagePixmap)
                  
          
              def changerContraste(self, contraste):
                  self.contraste = contraste
                  self.imagePILcont = Fonction.contraster(self.imagePIL, self.contraste)
                  self.imagePixmap = QtGui.QPixmap.fromImage(ImageQt.ImageQt(self.imagePILcont))
                  self.update()
          
          
              def changerImage(self, pathImage):
                  self.pathImage = pathImage
                  self.imagePIL = Image.open(str(pathImage))
                  self.imagePILx ,self.imagePILy = self.imagePIL.size
                  self.imagePILcont = Fonction.contraster(self.imagePIL, self.contraste)
                  self.imagePixmap = QtGui.QPixmap.fromImage(ImageQt.ImageQt(self.imagePILcont))
                  self.update()
          
          
          
          
          
          class Graphic(QtGui.QGraphicsView):
              
              def __init__(self, pathImage, xRect, yRect, xLength, yWidht, zoom, contraste):
                  QtGui.QGraphicsView.__init__(self)
          
                  self.image = ImageGraph(pathImage, contraste)
                  self.rect = Rectangle(xLength, yWidht)
                  self.xRect = xRect
                  self.yRect = yRect
                  
                  self.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
                  
                  self.scene = QtGui.QGraphicsScene(self)
                  self.setScene(self.scene)
                  self.scene.addItem(self.image)
                  self.scene.addItem(self.rect)
                  self.rect.setPos(xRect, yRect)
                  self.image.setPos(0, 0)
          
              
              def scaleView(self, scaleFactor):
                  factor = self.matrix().scale(scaleFactor, scaleFactor).mapRect(QtCore.QRectF(0, 0, 1, 1)).width()
                  if factor < 0.07 or factor > 100:
                      return
                  self.scale(scaleFactor, scaleFactor)
          
                  
              def keyPressEvent(self, event):
                  key = event.key()
                  if key == QtCore.Qt.Key_Plus:
                      self.scaleView(1.2)
                  elif key == QtCore.Qt.Key_Minus:
                      self.scaleView(1 / 1.2)
          
                      
              def maj(self, pathImage = -1, xRect = -1, yRect = -1, xLength = -1, yWidht = -1, contraste = -1): 
                  if pathImage != -1:
                      self.image.changerImage(pathImage)
                  if xRect != -1:
                      self.xRect = xRect
                      self.rect.setPos(xRect, yRect)
                  if yRect != -1:
                      self.yRect = yRect
                      self.rect.setPos(xRect, yRect)
                  if xLength != -1:
                      self.rect.modifX(xLength)
                  if yWidht != -1:
                      self.rect.modifY(yWidht)
                  if contraste != -1:
                      self.image.changerContraste(contraste)
          
          
          
          ### Pour tester cette classe
          ##app = QtGui.QApplication(sys.argv)
          ##
          ##path = str(QtCore.QDir().absolutePath()) + "/image/dei00302957.bmp"
          ##
          ##widget = Graphic(path,0,0,256/2,256/2,1,0.5)
          ##widget.maj(xLength  = 256)
          ##widget.show()
          ##
          ##sys.exit(app.exec_())
          



          Dans ma classe MainWindow qui hérite de QMainwindows, j'essai d'utiliser ce slot de cette manière :
          self.connect(self.graph.rect, QtCore.SIGNAL("posChanged()"),self.changerCaseX)
          




          • Partager sur Facebook
          • Partager sur Twitter
            12 août 2008 à 15:36:29

            Es-tu sur que le signal posChanged existe ? Je ne trouve rien dessus.
            • Partager sur Facebook
            • Partager sur Twitter
              12 août 2008 à 16:05:22

              Citation : cedrix

              Ma classe hérite de QGraphicsItem qui hérite de QObject.


              Ou pas. Et ton problème vient de là.
              • Partager sur Facebook
              • Partager sur Twitter
                12 août 2008 à 17:41:09

                Ah oui en effet :D . J'avais pas vu.
                • Partager sur Facebook
                • Partager sur Twitter
                  12 août 2008 à 18:38:57

                  Oui en fait le problème venait bien de la, j'ai du mal lire la doc lorsque j'ai vérifié dsl. J'ai donc cré un QWidget dans ma classe pour emettre des signal.
                  Par contre j'ai quand même un problème, je sait pas quand emettre le signal. J'ai essayé d'emetre le signal à chaque fois que la fonction pain de la classe Rectangle est appelé, mais ça ne fonctionne pas trés bien. Il faudrait que je puisse envoyer un signal des que la position de mon rectangle est modifié dans la QGraphicsScene de QScrollView, mais je vois pas comment faire, je sait pas siq uelqu'un aurait une idée ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 août 2008 à 14:12:31

                    Finalement c'est bon j'ai trouvé d'ou venez mon problème, c'était une erreur d'algorithme dans mon fichier QMainWindow
                    • Partager sur Facebook
                    • Partager sur Twitter

                    [pyQt]creer un signal

                    × 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