2017-07-10 3 views
-1

Ich bin neu auf Pyqt und ich versuche, eine UI zu erstellen, die einen Kreis (mit QPainter) auf ein Bild (QLabel) drucken, wenn wir die Pixelposition angeben. Zum Testen verwende ich ein Mausverfolgungsereignis, aber ich vermute, dass ich Probleme mit der Bild- oder Label-Größenänderung habe. Im Folgenden ein Bild von meiner Implementierung:Wie setze ichPixmap korrekt auf PyQt5?

Ergebnis:

Werfen Sie einen Blick auf die Position des Zeigers und des Kreises. Das möchte ich lösen.

Im Folgenden finden Sie den Code zu sehen (ich bin mit PIL (um das Bild zu laden) und PyQt5):

...  

    self.image = Image.open("Images/Quart_top_View_draw.jpg") 
    self.MainWindow.TennisCourtImage.setMouseTracking(True) 
    self.MainWindow.TennisCourtImage.mouseMoveEvent = self.get_mouse_pos 

def get_mouse_pos(self,event):  
    x = event.pos().x() 
    y = event.pos().y() 
    print("Position: ", x,y) 

    img = self.image 
    width, height = img.size 
    print("Image Size: ", width, height) 

    img = ImageQt(img) 
    pixmap_image = QtGui.QPixmap.fromImage(img) 

    self.painterInstance = QtGui.QPainter(pixmap_image) 
    self.painterInstance.setPen(QPen(Qt.red, 15, Qt.SolidLine)) 
    self.painterInstance.drawEllipse(x,y,15,15) 
    self.painterInstance.end() 

    myScaledPixmap = pixmap_image.scaled(self.MainWindow.TennisCourtImage.size(), Qt.KeepAspectRatio) 
    self.MainWindow.TennisCourtImage.setPixmap(myScaledPixmap) 

    ... 

Kann mir jemand helfen, bitte?

Grüße,

Gabriel: D

+0

Warum verwenden Sie PIL? – eyllanesc

+0

Und was ist dein Problem?, Was willst du bekommen? – eyllanesc

+0

PIL ist nicht notwendig. Ich könnte nur ändern, wo ich PIL für die Linie \t \t Pixmap_image = QtGui.QPixmap ("Bilder/Quart_top_View_draw.jpg") verwenden. Was ich brauche ist, den Kreis zu zeichnen, wo mein Zeiger ist. –

Antwort

0

Statt QLabel verwenden Sie eine benutzerdefinierte Widget erstellen könnte, die diese Aufgabe ausführt, wie unten dargestellt:

class Stadium(QWidget): 
    def __init__(self, pixmap, parent=None): 
     QWidget.__init__(self, parent=parent) 
     self.pixmap = pixmap 
     self.pos = None 
     self.setMouseTracking(True) 

    def paintEvent(self, event): 
     painter = QPainter(self) 
     painter.drawPixmap(self.rect(), self.pixmap) 
     painter.setPen(QPen(Qt.red, 15, Qt.SolidLine)) 
     if self.pos: 
      painter.drawEllipse(self.pos, 15, 15) 

    def mouseMoveEvent(self, event): 
     self.pos = event.pos() 
     self.update() 

Beispiel:

class Widget(QWidget): 
    def __init__(self, parent=None): 
     QWidget.__init__(self, parent=parent) 
     self.setLayout(QVBoxLayout()) 
     label = Stadium(QPixmap("475776182987.png")) 
     self.layout().addWidget(label) 
     self.resize(640, 480) 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    w = Widget() 
    w.show() 
    sys.exit(app.exec_()) 

Screenshot:

enter image description here

+0

Hallo eyllanesc. Deine Antwort funktioniert ziemlich gut. Ich füge das QWidget in meinem Hauptfenster hinzu. Ich danke dir sehr. –

+0

Hallo @ eyllanesc. Es ist möglich, das Bildgrößenverhältnis beizubehalten? Wenn ja, könntest du mir helfen? –

+0

Wenn die Beziehung des Labels nicht mit der des Bildes übereinstimmt, das Sie anzeigen möchten? – eyllanesc