pyqt рисува върху съществуваща джаджа на GUI

Нов съм в pyqt. Правя програма, която ви позволява да щраквате върху картината и да запомняте координатите на точките, върху които щраквате, и да рисувате стикова фигура върху изпълним модул на GUI. Моят код в момента може да изведе нов прозорец, за да покаже многоъгълник с 4 точки. Въпреки това се надявам, че може да се покаже на потребителския файл, който вече направих от pyqt. Името на обекта за приспособлението се нарича widget. Надявам се, че някой може да ми помогне да модифицирам кода, така че да показва многоъгълника в графичния приспособление, без да показва нов прозорец.

Много благодаря!!!

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_())

person user1167910    schedule 24.01.2012    source източник


Отговори (1)


Изглежда, че искате да рисувате елементи на QGraphicsScene? В този случай можете да добавите елементи към сцената:

#!/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 има много функции.

Прочетете Общ преглед на Graphics View Framework в Qt документи.

person reclosedev    schedule 28.01.2012
comment
Най-накрая един пример, който ми дава полезен код, който наистина работи! - person Ivo Flipse; 03.08.2012
comment
Как бихте добавили друг image.png на някаква позиция?, например вместо елипса имам нужда от малки изображения, опитах с addPixmap и addItem, но нито едно от тях не беше успешно. Моля, помогни ми - person Aleksandar; 29.08.2013
comment
item = self.scene.addPixmap(QtGui.QPixmap('some_image.png')) трябва да работи. Но добавя изображение към (0, 0) позиция, така че трябва да го промените: item.setPos(position), където position може да бъде напр. event.pos() - person reclosedev; 29.08.2013