Рисование pyqt на существующем виджете графического интерфейса

Я новичок в pyqt. Я делаю программу, которая позволяет вам нажимать на картинку и запоминать координаты точек, на которые вы нажимаете, и рисовать фигурку на виджете графического интерфейса. Мой код прямо сейчас может вывести новое окно, чтобы показать многоугольник с 4 точками. Однако я надеюсь, что это можно отобразить в файле пользовательского интерфейса, который я уже сделал с помощью pyqt. Имя объекта для виджета называется виджетом. Я надеюсь, что кто-нибудь поможет мне изменить код, чтобы отображать многоугольник в виджете с графическим интерфейсом, не открывая новое окно.

Большое спасибо!!!

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