2017-10-08 6 views
0

GUI가있는 간단한 소프트웨어로 작업하고 있습니다. (저는 PyQt를 사용하고 있습니다) 두 개의 라디오 버튼이 있습니다. 첫 번째를 선택한 경우 Graphicsscene을 클릭하면 GraphicsItem이 장면에 추가됩니다. 버튼을 눌러이 점의 색상을 변경하는 버튼이 필요합니다. 색깔은 중요하지 않습니다. 예를 들어 빨간색 일 수 있습니다. 내가 어떻게 할 수 있니? 고맙습니다!QGraphicsItem의 색 변경

위젯을 배치하기 위해 Qt 디자이너를 사용하고 SimpleWindow라는 하위 클래스를 만들었습니다. 여기

코드입니다 : 점 클래스 :

from PyQt5.QtCore import QRectF, Qt 
from PyQt5.QtWidgets import QGraphicsItem 

class Point(QGraphicsItem): 
    def __init__(self, x, y): 
     super(Point, self).__init__() 
     self.setFlag(QGraphicsItem.ItemIsSelectable, True) 
     self.rectF = QRectF(0, 0, 4, 4) 
     self.x=x 
     self.y=y 

    def boundingRect(self): 
     return self.rectF 

    def paint(self, painter=None, style=None, widget=None): 
     painter.fillRect(self.rectF, Qt.black) 

import sys 
from PyQt5 import QtCore, QtWidgets 
from PyQt5.QtGui import QPen, QBrush 
from PyQt5.QtWidgets import QGraphicsScene 

장면 :

class PointsGraphicsScene(QGraphicsScene): 
    def __init__(self, parent=None): 
     QGraphicsScene.__init__(self, parent) 
     self.setSceneRect(0, 0, 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": 
      p = point.Point(x, y) 
      p.setPos(x, y) 
      self.addItem(p) 
     elif self.opt == "Select": 
      print(x, y) 

대화 창이이 클래스에 의해 생성되는

import sys 
from PyQt5 import QtCore, QtWidgets 
from PyQt5.QtWidgets import QButtonGroup 
import window 
from scene import PointsGraphicsScene 

class SimpleWindow(QtWidgets.QMainWindow, window.Ui_Dialog): 
    def __init__(self, parent=None): 
     super(SimpleWindow, self).__init__(parent) 
     self.setupUi(self) 
     self.scene = PointsGraphicsScene(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()) 


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

디자이너.

class Point(QGraphicsItem): 
    def __init__(self, x, y): 
     super(Point, self).__init__() 
     self.setFlag(QGraphicsItem.ItemIsSelectable, True) 
     self.rectF = QRectF(0, 0, 4, 4) 
     self.x=x 
     self.y=y 
     self._brush = QBrush(Qt.black) 

    def setBrush(self, brush): 
     self._brush = brush 
     self.update() 

    def boundingRect(self): 
     return self.rectF 

    def paint(self, painter=None, style=None, widget=None): 
     painter.fillRect(self.rectF, self._brush) 

할 두 번째 것은 버튼을 생성하고 일부를 찾을 수 있습니다 : 우리가 setBrush()를 호출합니다

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")) 
+0

를? – eyllanesc

답변

0

우선이 경우, 색상을 변경하는 방법을 만드는 것입니다 위치. 그러면 QPushButton 클릭 신호가 일부 슬롯에 연결됩니다. 그런 다음 우리는 items() 방법을 통해 현장의 아이템을 얻을 setBrush()와 색상 변경 : 당신이 포인트를 사용합니까

class SimpleWindow(QtWidgets.QMainWindow, window.Ui_Dialog): 
    def __init__(self, parent=None): 
     super(SimpleWindow, self).__init__(parent) 
     self.setupUi(self) 
     self.scene = PointsGraphicsScene(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()) 

     button = QPushButton("change color", self) 
     button.move(20, 140) 

     button.clicked.connect(self.onClicked) 

    def onClicked(self): 
     for item in self.scene.items(): 
      item.setBrush(QColor("red")) 


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

죄송합니다. 슬프게도 나는 실수를했다. 나는 Scene 클래스에서 Point 클래스를 사용한다. if self.opt == "Generate": self.addEllipse (x, y, 4, 4, pen, brush) 다음 내용 : if self.opt == "생성" : p = point.Point (x, y) p.setPos (x, y) self.addItem (p) –

+0

@ DàvidNagy (편집자 : https://stackoverflow.com/posts/46635001/edit) 질문에 대답 해주세요. – eyllanesc

+0

위의 코드를 편집했습니다. 고맙습니다! –