2017-10-20 16 views
0

QLabel이있는 QLayout이있는 QWidget이 있습니다. 레이블에 QPixmap을 설정했습니다. 사용자가 이미지를 클릭 할 때마다 지점을 그려야합니다. mouseReleaseEvent (작동)와 paintEvent (포인트는 그려지지 않음)를 정의했습니다. 나는 비슷한 질문을 모두 읽었으며 어떤 해결책도 나를 위해 일하지 않았다. 어떤 도움이 필요합니까? 내 관련 코드 :QWidget (pyqt5)에서 QPixmap의 드로잉 포인트

class ImageScroller(QtWidgets.QWidget): 

    def __init__(self, img): 
     QtWidgets.QWidget.__init__(self) 
     main_layout = QtWidgets.QVBoxLayout() 
     self._image_label = QtWidgets.QLabel() 
     self._set_image(img) 
     main_layout.addWidget(self._image_label) 
     main_layout.addStretch() 
     self.setLayout(main_layout) 

    def _set_image(self, img): 
     img = qimage2ndarray.array2qimage(img) 
     qimg = QtGui.QPixmap.fromImage(img) 
     self._img_pixmap = QtGui.QPixmap(qimg) 
     self._image_label.show() 

    def paintEvent(self, paint_event): 
     painter = QtGui.QPainter(self) 
     painter.begin(self) 
     painter.setPen(QtGui.QPen(QtCore.Qt.red)) 
     pen = QtGui.QPen() 
     pen.setWidth(20) 
     painter.setPen(pen) 
     painter.setRenderHint(QtGui.QPainter.Antialiasing, True) 
     painter.drawPoint(300,300) 
     painter.drawLine(100, 100, 400, 400) 
     for pos in self.chosen_points: 
      painter.drawPoint(pos) 
     painter.end() 

    def mouseReleaseEvent(self, cursor_event): 
     self.chosen_points.append(QtGui.QCursor().pos()) 
     self.update() 
+0

은 어디'mouseReleaseEvent' 구현입니까? 'update()'메서드를 호출 했습니까? – eyllanesc

+0

예. mouseReleaseEvent 구현을 사용하여 게시물을 편집했습니다. –

답변

0

당신이 QtGui.QCursor.pos() 화면에 대한 커서의 좌표를 점점 사용하지만, 당신은 당신이 위젯의 ​​좌표에 있어야 위젯을 페인트 할 때, 그것은 위젯 mapToGlobal() 방법이 있습니다

self.mapFromGlobal(QtGui.QCursor.pos()) 

을하지만이 경우 또 다른 해결책은, 당신은 pos() 방법의 정보가 mouseReleaseEvent 반환하는 이벤트 사용해야있다 :

,743을210

또 다른 문제점은 작성한 레이블이 위젯 위에 있으므로 점이 보이지 않는 것이므로 가장 쉬운 방법은 을 drawPixmap() 메소드로 직접 그립니다.

전체 코드 :

from PyQt5 import QtWidgets, QtGui, QtCore 


class ImageScroller(QtWidgets.QWidget): 
    def __init__(self): 
     self.chosen_points = [] 
     QtWidgets.QWidget.__init__(self) 
     self._image = QtGui.QPixmap("image.png") 

    def paintEvent(self, paint_event): 
     painter = QtGui.QPainter(self) 
     painter.drawPixmap(self.rect(), self._image) 
     pen = QtGui.QPen() 
     pen.setWidth(20) 
     painter.setPen(pen) 
     painter.setRenderHint(QtGui.QPainter.Antialiasing, True) 
     painter.drawPoint(300, 300) 
     painter.drawLine(100, 100, 400, 400) 
     for pos in self.chosen_points: 
      painter.drawPoint(pos) 

    def mouseReleaseEvent(self, cursor_event): 
     self.chosen_points.append(cursor_event.pos()) 
     # self.chosen_points.append(self.mapFromGlobal(QtGui.QCursor.pos())) 
     self.update() 


if __name__ == '__main__': 
    import sys 

    app = QtWidgets.QApplication(sys.argv) 
    w = ImageScroller() 
    w.resize(640, 480) 
    w.show() 
    sys.exit(app.exec_()) 

enter image description here