2012-01-24 3 views
5

Я новичок в pyqt. Я делаю программу, которая позволяет вам нажимать на изображение и запоминать координаты точек, на которые вы нажимаете, и нарисовать stickfigure на виджетах графического интерфейса. Мой код сейчас может запросить новое окно, чтобы показать многоугольник с 4 точками. Тем не менее, я надеюсь, что он будет отображаться в файле ui, который я делаю pyqt. Имя объекта для виджета называется widget.I надеюсь, что кто-то может помочь мне изменить код, чтобы отобразить многоугольник виджета gui, не запрашивая новое окно.pyqt рисунок на расширяющемся виджетах GUI

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

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

ответ

5

Похоже, вы хотите нарисовать предметы на 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 overview в документах Qt.

+1

Наконец-то пример, который дает мне полезный код, который действительно работает! –

+0

Как бы вы добавили другое изображение.png в некоторой позиции ?, например, вместо эллипса мне нужны маленькие изображения, я пробовал с addPixmap и addItem, но ни один из них не был успешным. помогите мне – Aleksandar

+0

'' item = self.scene.addPixmap (QtGui.QPixmap ('some_image.png')) '' должен работать. Но он добавляет изображение в (0, 0) позицию, поэтому вам нужно изменить его: '' item.setPos (position) '', где '' position'' может быть, например, '' Event.pos() '' – reclosedev

Смежные вопросы