2012-01-24 12 views
5

Jestem nowy w pyqt. Robię program, który pozwala klikać obraz i pamiętać współrzędne klikanych punktów i narysować stickfigure na widżecie GUI. Teraz mój kod może wyświetlić nowe okno, pokazujące wielokąt z 4 punktami. Mam jednak nadzieję, że będzie można go wyświetlić na pliku ui, który robię wcześniej przez pyqt. Nazwa obiektu dla widgetu nazywa się widget. Mam nadzieję, że ktoś mi pomoże zmodyfikować kod, aby wyświetlić wielokąt na widżecie GUI, nie wyświetlając nowego okna.rysowanie pyqta na widgecie exsiting GUI

Dziękuję bardzo!

import sys 
from PyQt4.QtCore import * 
from PyQt4 import QtGui, QtCore 
from PyQt4.QtGui import * 
from Main_window import * 

global imgloc 
imgloc = "1.jpg" 
array = [] 
clicks = 0 

class MyForm(QtGui.QMainWindow): 

    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 
     self.local_image = QImage(imgloc) 
     self.imageLocation = imgloc 
     self.local_scene = QGraphicsScene() 
     self.pixMapItem = QGraphicsPixmapItem(QPixmap(self.local_image), None, self.local_scene) 
     self.ui.graphicsView_5.setScene(self.local_scene) 
     self.pixMapItem.mousePressEvent = self.pixelSelect 

    def pixelSelect(self,event): 
     global imgloc 
     a = event.pos().x() 
     b = event.pos().y() 
     global clicks 
     global array 
     if clicks != 4: 
      clicks += 1 
      point = QPoint(a,b) 
      array.append(point) 
     else: 
      clicks = 0 
      dialog = DialogBody() 
      dialog.show() 
      dialog.exec_() 
      array = [] 

class DialogBody(QDialog): 
    def __init__(self,parent=None): 
     super(QDialog,self).__init__(parent) 
     self.setGeometry(100, 100, QImage(imgloc).height(), QImage(imgloc).width()) 

    def paintEvent(self,e): 
     qp = QtGui.QPainter() 
     qp.begin(self) 
     self.drawBody(qp) 
     qp.end() 

    def drawBody(self, qp): 
     qp.setPen(QtCore.Qt.red) 
     qp.drawPolygon(array[0],array[1],array[2],array[3]) 
     qp.drawEllipse(array[0],2,2) 
     qp.drawEllipse(array[1],2,2) 
     qp.drawEllipse(array[2],2,2) 
     qp.drawEllipse(array[3],2,2) 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    myapp= MyForm() 
    myapp.show() 
    sys.exit(app.exec_()) 

Odpowiedz

5

Wygląda na to, że chcesz rysować elementy na QGraphicsScene? W tym przypadku można dodać elementy do sceny:

#!/usr/bin/env python 
import sys 

from PyQt4 import QtCore, QtGui 


class MainWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.scene = QtGui.QGraphicsScene() 
     self.view = QtGui.QGraphicsView(self.scene) 
     layout = QtGui.QVBoxLayout() 
     layout.addWidget(self.view) 
     self.setLayout(layout) 
     self.pixmap_item = QtGui.QGraphicsPixmapItem(QtGui.QPixmap('image.png'), None, self.scene) 
     self.pixmap_item.mousePressEvent = self.pixelSelect 
     self.click_positions = [] 

    def pixelSelect(self, event): 
     self.click_positions.append(event.pos()) 
     if len(self.click_positions) < 4: 
      return 
     pen = QtGui.QPen(QtCore.Qt.red) 
     self.scene.addPolygon(QtGui.QPolygonF(self.click_positions), pen) 
     for point in self.click_positions: 
      self.scene.addEllipse(point.x(), point.y(), 2, 2, pen) 
     self.click_positions = [] 


if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    widget = MainWidget() 
    widget.resize(640, 480) 
    widget.show() 
    sys.exit(app.exec_()) 

QGraphicsScene posiada wiele funkcji.

Przeczytaj Graphics View Framework overview w dokumentach Qt.

+1

Nareszcie przykład, który daje mi użyteczny kod, który faktycznie działa! –

+0

Jak dodać kolejne image.png w jakiejś pozycji ?, na przykład zamiast elipsy Potrzebuję trochę obrazów, próbowałem z addPixmap i addItem, ale żadna z nich nie powiodła się. proszę pomóż mi – Aleksandar

+0

'' item = self.scene.addPixmap (QtGui.QPixmap ('some_image.png')) '' powinno działać. Ale dodaje obraz do pozycji (0, 0), więc musisz go zmienić: '' item.setPos (position) '', gdzie '' position'' może być np. '' event.pos() '' – reclosedev