2012-10-22 2 views
8

내 프로젝트에서 QGraphicsScene을 사용하고 코드 전체에 항목을 추가/제거하고 있습니다.addItem 또는 itemChange에서 QGraphicsScene의 알림을받는 방법?

이제 QGraphicsItem이 추가되거나 제거 될 때마다 알림을 받고 싶습니다. 많은 Qt 클래스에는 이러한 변경에 대해 호출되는 알림 신호 또는 최소한 가상 함수가 있습니다. 난 성가신뿐만 아니라 안전하지 않은 (삽입/제거를 지금 또는 미래에 잊어 버리는) 많은 장소에서 많은 행의 코드를 추가하는 것을 피하려고합니다.

QGraphicsItem과 호환되는 솔루션이 필요합니다. -> 아무도 없다

  • 이 (QAbstractItemModel::rowsInserted() 같이) QGraphicsScene의 신호에 연결 :

    작동하지 않는 것들의 목록입니다.
  • QGraphicsScene에서 상속 받고 가상 알림 기능을 오버로드 (QTabWidget::tabInserted()에서와 같이) -> 없습니다.
  • 상속 및 과부하 addItem(), 전송 통지 (QMdiArea::addSubWindow()에서와 같이) 자신 ->addItem 가상하지 않고 QGraphicsItems의 생성자에서 호출됩니다.
  • 새로 추가 된 이벤트 필터는 QGraphicsItems입니다.> 새로 추가 된 항목을 얻는 방법을 모르면 다른 QGraphicsItems에만 설치할 수있는 sceneEventFilter이됩니다.
  • 에 연결 itemChange()QGraphicsItem ->itemChange은 신호가 아니며 과부하가 아닙니다. QGraphicsItem은 옵션이 아닙니다.
  • QGraphicsScene (개인 회원으로 장면을 가진) 만 기능을 노출 addItemremoveItem ->하지만 여전히 scene() 기능을 통해 액세스 할 수있는 장면 QGraphicsItems 때문에,이 솔루션은 충분히 안전하지 않습니다.

항목 변경 사항에 대한 알림은 어떻게 받습니까?

간단히 놓친 쉬운 방법이 있으면 알려주십시오. 그렇지 않으면 이것에 대한 아이디어를 매우 고맙게 생각합니다.

+0

가장 좋은 방법은 QGraphicsScene을 랩핑하고 래퍼에 자신의'addItem()'함수를 제공하는 것입니다. – pmr

+0

'QGraphicsItem'은 장면 변경 (장면 추가/제거 포함)을'sceneEvent (QEvent * event)'메소드로 하위 클래스로 분류 할 수 없기 때문에 문제를 매우 깨끗하고 조정 가능한 해결책을 제공합니다. – cmannett85

+0

@pmr 말했듯이'addItem()'함수는 가상이 아니며'QGraphicsItem'의 생성자에서 호출됩니다. 그래서 이것은 완전한 해결책은 아닙니다. –

답변

0

내가 할 수있는 최선의 방법은 QGraphicsScene::changed() 신호에 연결하는 것입니다.

QGraphicsView이 디스플레이를 업데이트하기 위해 변경/추가/제거되는 항목을 알려주지 않습니다. 그러나 제공된 지역을 사용하여 알아낼 수 있어야합니다.