2012-01-24 32 views
5

Tôi mới sử dụng pyqt. Tôi đang thực hiện một chương trình cho phép bạn nhấp vào hình ảnh và nhớ tọa độ của các điểm bạn nhấp và vẽ một hình khối trên một widget của GUI. Mã của tôi ngay bây giờ có thể nhắc ra một cửa sổ mới để hiển thị đa giác với 4 điểm. Tuy nhiên, tôi hy vọng nó có thể được hiển thị trên tập tin ui tôi alreay được thực hiện bởi pyqt. Tên đối tượng cho widget được gọi là widget.I hy vọng ai đó có thể giúp tôi sửa đổi mã để hiển thị đa giác trên tiện ích gui không nhắc ra một cửa sổ mới.vẽ pyqt trên tiện ích con xuất hiện của GUI

Cảm ơn bạn rất nhiều !!!

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

Trả lời

5

Có vẻ như bạn muốn vẽ các mục trên QGraphicsScene? Trong trường hợp này, bạn có thể thêm các mục vào cảnh:

#!/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 có nhiều tính năng.

Đọc Graphics View Framework overview trong tài liệu Qt.

+1

Cuối cùng một ví dụ cung cấp cho tôi một số mã hữu ích thực sự hoạt động! –

+0

Bạn sẽ thêm một image.png khác tại một số vị trí như thế nào ?, ví dụ thay vì hình elip, tôi cần những hình ảnh nhỏ, tôi đã thử với addPixmap và addItem nhưng không có thành phần nào trong số đó thành công. hãy giúp tôi – Aleksandar

+0

'' item = self.scene.addPixmap (QtGui.QPixmap ('some_image.png')) '' sẽ hoạt động. Nhưng nó thêm ảnh vào vị trí (0, 0), vì vậy bạn cần thay đổi nó: '' item.setPos (vị trí) '', nơi '' vị trí'' có thể là ví dụ. '' event.pos() '' – reclosedev

Các vấn đề liên quan