2017-10-08 66 views
0

私はGUIを持ったシンプルなソフトウェアを開発しています。 (私はPyQtを使用しています) 私は2つのラジオボタンを持っています。最初のものが選択されている場合、Graphicssceneをクリックすると、GraphicsItemがシーンに追加されます。 ボタンを押すと、これらのポイントの色が変わるボタンがあります。色は関係ありません。たとえば、赤色になる可能性があります。どうすればいい?ありがとうございました!QGraphicsItemの色を変更する

ウィジェットを配置するために、私はQt Designerを使用し、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) 

行うには2つ目はボタンを作成し、いくつかのそれを見つけている:我々は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 == "Generate" : p = point.Point(x、y) p.setPos(x、y) self.addItem(p) –

+0

@DàvidNagy[編集](https://stackoverflow.com/posts/46635001/edit)あなたが正しく答えることができるように質問 – eyllanesc

+0

私は上記のコードを編集しました。ありがとうございました! –

関連する問題