2016-07-15 5 views
0

Я пытаюсь нарисовать прямоугольник вокруг элементов, выбранных в сцене (либо через RubberBandDrag, либо ctrl + click для каждого элемента).Использование selectionChanged сигнала от QGraphicsScene для addRect вокруг выбранных элементов

Для того, чтобы сделать это я подклассы QGraphicsScene и переписана метод selectionChanged для добавления QGraphicsRectItem вокруг выбранной области, но по какой-то причине, этот метод не вызывается, когда элементы выбираются или невыбранные в сцене. Я убедился, что элементы на самом деле можно выбрать.

Вот минимальный пример того, что я пытаюсь сделать:

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 
import sys 

class DiagramScene(QGraphicsScene): 

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

     self.selRect = None 

    def selectionChanged(self): 
     area = self.selectionArea().boundingRect() 
     pen = QPen() 
     pen.setColor(Qt.black) 
     pen.setStyle(Qt.DashLine) 

     self.selRect = self.addRect(area, pen) 


if __name__ == "__main__": 

    app = QApplication(sys.argv) 

    view = QGraphicsView() 
    view.setDragMode(QGraphicsView.RubberBandDrag) 

    scene = DiagramScene() 

    scene.setSceneRect(0, 0, 500, 500) 

    rect1 = scene.addRect(20, 20, 100, 50) 
    rect2 = scene.addRect(80, 80, 100, 50) 
    rect3 = scene.addRect(140, 140, 100, 50) 

    rect1.setFlag(QGraphicsItem.ItemIsSelectable, True) 
    rect2.setFlag(QGraphicsItem.ItemIsSelectable, True) 
    rect3.setFlag(QGraphicsItem.ItemIsSelectable, True) 

    view.setScene(scene) 
    view.show() 

    sys.exit(app.exec_()) 

ответ

1

selectionChanged является сигналом, а не метод, который необходимо реализовать. Что вам нужно сделать, это подключить этот сигнал к слоту и вашей реализации в слоте, поэтому всякий раз, когда сигнал испускается, код запускается на выполнение:

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 
import sys 

class DiagramScene(QGraphicsScene): 

    def __init__(self, parent=None): 
     super().__init__(parent) 
     self.selRect = None 
     self.selectionChanged.connect(self.onSelectionChanged) 

    @pyqtSlot() 
    def onSelectionChanged(self): 
     area = self.selectionArea().boundingRect() 
     pen = QPen() 
     pen.setColor(Qt.black) 
     pen.setStyle(Qt.DashLine) 
     self.selRect = self.addRect(area, pen) 


if __name__ == "__main__": 

    app = QApplication(sys.argv) 

    view = QGraphicsView() 
    view.setDragMode(QGraphicsView.RubberBandDrag) 

    scene = DiagramScene() 

    scene.setSceneRect(0, 0, 500, 500) 

    rect1 = scene.addRect(20, 20, 100, 50) 
    rect2 = scene.addRect(80, 80, 100, 50) 
    rect3 = scene.addRect(140, 140, 100, 50) 

    rect1.setFlag(QGraphicsItem.ItemIsSelectable, True) 
    rect2.setFlag(QGraphicsItem.ItemIsSelectable, True) 
    rect3.setFlag(QGraphicsItem.ItemIsSelectable, True) 

    view.setScene(scene) 
    view.show() 

    sys.exit(app.exec_()) 
+0

Не знаю, как я пропустил это ... Спасибо! – pbreach