2017-10-08 512 views
0

我正在研究一个简单的软件,它有一个GUI。 (我正在使用PyQt) 我有2个单选按钮。如果选择了第一个,则通过单击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_() 

这是由生成的类设计师。

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

的第一件事情就是创建一个改变颜色,在这种情况下的方法,我们将其称之为setBrush()

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) 

做的第二件事是创建按钮,并在一些找到它位置。那么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) by this: 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

我编辑了上面的代码。谢谢! –