문제

QgraphicsView의 도면 프로세스를 사용자 정의해야하므로 다음과 같은 DrawItems 메소드를 무시합니다.

self.graphicsview.drawItems=self.drawer.drawItems

어디 self.graphicsview qgraphicsview입니다 self.drawer 메소드가있는 사용자 정의 클래스입니다 drawItems.
이 방법에서는 각 항목을 그리는 방법을 결정하기 위해 몇 가지 플래그를 확인한 다음 item.paint, 이와 같이:

def drawItems(self, painter, items, options):
    for item in items:
        print "Processing", item
        # ... Do checking ...
        item.paint(painter, options, self.target)

self.target QgraphicsView의 QgraphicsScene입니다.
그러나 일단 도달하면 item.paint, 오류없이 루프에서 벗어납니다. 그림 주위에 조건부를 넣고 가능한 각 유형의 QgraphicsItem에 대해 (QT Git-Sources를 보면) 실행해야 할 코드를 붙여 넣으면 모든 것이 작동합니다.
그래도 아주 좋은 솔루션은 아닙니다 ... 그리고 어떻게 루프에서 벗어날 수 있는지 이해가 안 돼요?

도움이 되었습니까?

해결책

품목이 페인트 될 때 발생하는 예외가 있지만 즉시보고되지 않습니다. 내 시스템 (PYQT 4.5.1, Python 2.6)에서 Monkey-Patch에서 다음 방법을보고 할 때 예외는보고되지 않습니다.

def drawItems(painter, items, options):
    print len(items)
    for idx, i in enumerate(items):
        print idx, i
        if idx > 5:
            raise ValueError()

산출:

45
0 <PyQt4.QtGui.QGraphicsPathItem object at 0x3585270>
1 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356ca68>
2 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356ce20>
3 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356cc88>
4 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356cc00>
5 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356caf0>
6 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356cb78>

그러나 응용 프로그램을 닫으면 다음 방법이 인쇄됩니다.

Exception ValueError: ValueError() in <module 'threading' from '/usr/lib/python2.6/threading.pyc'> ignored

나는 인쇄를 시도했다 threading.currentThread(), 그러나 그것은 원숭이를 입은 내 밖에서 또는 외부에서 호출 되든 동일한 스레드를 반환합니다. drawItems 방법.

코드에서 이것은 당신이 통과했기 때문일 것입니다. options (스타일 옵션 개체 목록) 각 옵션 개체가 아닌 개별 항목에. 이 코드를 사용하면 올바른 결과가 제공됩니다.

def drawItems(self, painter, items, options):
    for item, option in zip(items, options):
        print "Processing", item
        # ... Do checking ...
        item.paint(painter, option, self.target)

또한, 당신은 말합니다 self.target 장면 객체입니다. 그만큼 문서화 paint() 말 :

일반적으로 QgraphicsView에 의해 호출되는이 기능은 항목의 내용을 로컬 좌표로 페인트합니다. ... 위젯 인수는 선택 사항입니다. 제공된 경우, 페인트 칠하는 위젯을 가리 킵니다. 그렇지 않으면 0입니다. 캐시 된 그림의 경우 위젯은 항상 0입니다.

그리고 유형은입니다 QWidget*. QGraphicsScene 상속 QObject 위젯이 아니기 때문에 이것이 잘못되었을 가능성이 높습니다.

그럼에도 불구하고, 예외가 전혀보고되지 않았거나 바로 파울 플레이를 암시한다는 사실은 관리자에게 연락해야합니다.

다른 팁

루프가 갑자기 나가는 이유는 예외가 발생하기 때문입니다. 파이썬은 처리하지 않습니다 (아니요 try: 블록), 따라서 Python 예외에 대해 전혀 모르는 호출 (QT의 C ++ 코드)으로 전달되므로 손실됩니다.

루프 주변을 제외하고 시도/를 추가하면 이것이 발생하는 이유를 알 수 있습니다.

참고 : Python 2.4이므로 더 이상이 방법을 무시하지 않아야합니다.

대신 QgraphicsView에서 새 클래스를 도출하고 추가해야합니다. drawItems() 이 새로운 클래스에 대한 방법. 이것은 원래 방법을 올바르게 대체합니다.

전화하는 것을 잊지 마십시오 super() 에서 __init__ 방법! 그렇지 않으면 객체가 제대로 작동하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top