2017-09-23 4 views
0

PyQt를 사용하여 간단한 프로그램을 Python으로 작성하고 싶습니다.PyQt : QGraphicsView의 마우스 이벤트

은 내가 QGraphicsScene을하고 난 다음을 수행 할 싶습니다 발생 지점에 대한

  1. : 2 개 개의 RadioButtons를를 사용하는 옵션이 있습니다. 이렇게하면 누군가가 장면을 클릭하면 타원이 나타납니다.
  2. 포인트를 골라줍니다. 이 방법은 포인트를 클릭하면 선택한 포인트가 반환됩니다.

필자는 PyQt와 GUI 프로그래밍에서 새로운 기능을 제공합니다. 내 주요 문제는 Qt에서 마우스 이벤트가 어떻게 작동 하는지를 이해하지 못한다는 것입니다. 누군가가 내게 마우스 이벤트의 기본 사항을 설명 할 수있을 정도로 친절하고 인내심이 있었고 위에서 설명한 문제에 대한 몇 가지 조언을 주신다면 매우 감사하게 생각합니다.

문제를 시각화하기 위해 사진도 첨부합니다. GUI

나는이 문제를 해결하려고 애썼다. 위젯을 배치하기 위해 Qt Designer를 사용하고 SimpleWindow라는 하위 클래스를 만들었습니다.

from PyQt5 import QtCore, QtGui, QtWidgets 

class Ui_Dialog(object): 
    def setupUi(self, Dialog): 
     Dialog.setObjectName("Dialog") 
     Dialog.resize(538, 269) 
     self.graphicsView = QtWidgets.QGraphicsView(Dialog) 
     self.graphicsView.setGeometry(QtCore.QRect(130, 10, 371, 221)) 
     self.graphicsView.setObjectName("graphicsView") 
     self.radioButton = QtWidgets.QRadioButton(Dialog) 
     self.radioButton.setGeometry(QtCore.QRect(20, 30, 82, 31)) 
     self.radioButton.setObjectName("radioButton") 
     self.radioButton_2 = QtWidgets.QRadioButton(Dialog) 
     self.radioButton_2.setGeometry(QtCore.QRect(20, 80, 82, 17)) 
     self.radioButton_2.setObjectName("radioButton_2") 

     self.retranslateUi(Dialog) 
     QtCore.QMetaObject.connectSlotsByName(Dialog) 

    def retranslateUi(self, Dialog): 
     _translate = QtCore.QCoreApplication.translate 
     Dialog.setWindowTitle(_translate("Dialog", "Dialog")) 
     self.radioButton.setText(_translate("Dialog", "Generate")) 
     self.radioButton_2.setText(_translate("Dialog", "Select")) 

감사합니다 :
import sys 
from PyQt5 import QtCore, QtWidgets 
from PyQt5.QtGui import QPen, QBrush 
from PyQt5.QtWidgets import QGraphicsScene 
import points 

class SimpleWindow(QtWidgets.QMainWindow, points.Ui_Dialog): 

    def __init__(self, parent=None): 
     super(SimpleWindow, self).__init__(parent) 
     self.setupUi(self) 

     self.graphicsView.scene = QGraphicsScene() 
     self.graphicsView.setScene(self.graphicsView.scene) 
     self.graphicsView.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) 

     self.graphicsView.mousePressEvent = self.pixelSelect 


    def pixelSelect(self, event): 
     pen = QPen(QtCore.Qt.black) 
     brush = QBrush(QtCore.Qt.black) 

     x = event.x() 
     y = event.y() 

     if self.radioButton.isChecked(): 
      print(x, y) 
      self.graphicsView.scene.addEllipse(x, y, 4, 4, pen, brush) 

     if self.radioButton_2.isChecked(): 
      print(x, y) 


app = QtWidgets.QApplication(sys.argv) 
form = SimpleWindow() 
form.show() 
app.exec_() 

는 디자이너에 의해 생성 된 클래스입니다.

+0

* 선택한 점이 무엇을 의미합니까? – eyllanesc

+0

좌표를 표시하면 충분합니다. –

+0

문제를 해결하고 시도했을 때의 문제를 알려주기를 권장합니다. 이 주제에는 인터넷에 관한 많은 정보가 있습니다. 바로 여기에 있습니다. – eyllanesc

답변

0

QGraphicsView에서 QGraphicsScene이 추가되면, 각각 다른 좌표 시스템을 관리합니다. QGraphicsView은 카메라와 비슷하며 QGraphicsScene은 세상과 비슷합니다. 장면에 항목을 추가 할 때 좌표계에 있어야합니다.

클릭 할 때 항목을 추가하려면 메서드를 QGraphicsScene으로 덮어 쓰고 scenePos() 메서드가 사용되는 장면의 좌표에서 위치를 얻는 것이 좋습니다.

또 다른 할 일은 setSceneRect()QGraphicsView이 볼 수있는 공간 인 속성을 초기화하는 것입니다.

버튼을 여러 개 사용하는 경우 버튼을 매핑하는 QButtonGroup을 사용하는 것이 좋습니다. 신호를 쉽게 처리 할 수 ​​있습니다.

class GraphicsScene(QGraphicsScene): 
    def __init__(self, parent=None): 
     QGraphicsScene.__init__(self, parent) 
     self.setSceneRect(-100, -100, 200, 200) 
     self.opt = "" 

    def setOption(self, opt): 
     self.opt = opt 

    def mousePressEvent(self, event): 
     pen = QPen(QtCore.Qt.black) 
     brush = QBrush(QtCore.Qt.black) 
     x = event.scenePos().x() 
     y = event.scenePos().y() 
     if self.opt == "Generate": 
      self.addEllipse(x, y, 4, 4, pen, brush) 
     elif self.opt == "Select": 
      print(x, y) 



class SimpleWindow(QtWidgets.QMainWindow, points.Ui_Dialog): 
    def __init__(self, parent=None): 
     super(SimpleWindow, self).__init__(parent) 
     self.setupUi(self) 

     self.scene = GraphicsScene(self) 
     self.graphicsView.setScene(self.scene) 
     self.graphicsView.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) 

     group = QButtonGroup(self) 
     group.addButton(self.radioButton) 
     group.addButton(self.radioButton_2) 

     group.buttonClicked.connect(lambda btn: self.scene.setOption(btn.text())) 
     self.radioButton.setChecked(True) 
     self.scene.setOption(self.radioButton.text())