2017-01-08 18 views
2

PyQt에서 표준 QBrush 채우기 패턴 중 하나 (이 경우 Qt.Dense7Pattern)를 사용하여 사각형을 추가하는 QGraphicsScene이 있습니다. 장면이 원본 1 : 1 비율로 표시 될 때 예상대로 나타납니다. Dense7 패턴을 구성하는 "도트"는 서로 몇 픽셀 떨어져 있으며, 숫자를 선택하기 위해 5 픽셀 간격을두고 있습니다. 또한 원래 직사각형의 너비가 50 픽셀이고 높이가 50 픽셀이라고 가정 해 보겠습니다.QBrush - 표준 채우기 점 패턴을 스케일링 하시겠습니까?

내가 그 장면을 확대 할 때, 2의 인자로 채워진 사각형이 100x100 픽셀로 나타나게한다고 가정 해 보겠습니다. 채우기 패턴의 도트는 5 픽셀 간격으로 계속 나타나지만 Qt는 확대됩니다 정적 채우기 패턴에서도 채우기 패턴의 도트를 10 픽셀 간격으로 표시합니다.

This question와 유사합니다. 브러쉬의 pixmap 채우기 패턴에 변형 (스케일 포함)을 적용 할 수는 있지만 브러시의 '표준'채우기 패턴에는 적용되지 않습니다. 난 그냥에서의 인스턴스를 만들

다음
class customFillPolygonItem(QGraphicsPolygonItem): 
    def paint(self,painter,option,widget=None): 
     # from here, painter.setBrush affects shapes drawn directly in this function; 
     # self.setBrush affects the call to super().paint 
     newBrush=QBrush(painter.brush()) 
     newBrush.setTransform(QTransform(painter.worldTransform().inverted()[0])) 
     self.setBrush(newBrush) 
     painter.setBrush(newBrush) 
     painter.drawRect(QRectF(0,0,50,50)) # draw a reality-check object 
     super(customFillPolygonItem,self).paint(painter,option,widget) 

: (잘하면 내가 필요한 모든 일들을했다)

전체 서브 클래스 : 나는 서브 클래스를했고, 이제 페인트 방식으로 변환 브러시,하지만 행운을 변경 위 사용함

myItem=customFillPolygonItem(QPolygonF(... 
myItem.setBrush(QBrush(Qt.Dense7Pattern)) 
myScene.addItem(myItem) 

그래서 브러시의 표준 채우기 패턴에 눈금을 적용 할 수 있습니까? 이것은 QBrush.setFlag (ItemIgnoresTransformations)와 비슷하지만 그런 것은 존재하지 않습니다 ...이 항목은 전체 항목 (이 경우 사각형)에만 설정할 수 있습니다.

해결 방법이 포함될 수 있습니다 : - 사용 ItemIgnoresTransformations 수동으로 필요 로 실제 사각형의 정점을 변환 - 을 각각의 표준 채우기 패턴의 아웃 qpixmap을, 다음 질문에로 확장해야하는 경우 브러시로 그 픽스맵을 사용하여 위에서 언급 한

물론 가장 간단한 해결책을 찾는 것이 좋을 것입니다.

업데이트 : Schollii가 묻는 질문에 답변합니다. 알파 값을 조사하라는 그의 제안은 내가이 특정 사례에서 겪었던 더 큰 문제에 대한 해결책을 이끌어 냈습니다. 제가 게시 한 솔루션에서 철자가 다른 그레이 스케일을 만들었습니다. 실제로는 제가 물어 본 질문에 대한 해결책이 아닙니다. 어쨌든 감사합니다!

답변

1

변환을 통해 목표에 도달 할 수 없다고 생각합니다. 채우기 패턴이 "장면"공간에서 생성 된 다음 뷰 배율 인수에 따라 변형이 적용됩니다. 분명히 점 사이의 간격을 늘릴 것입니다. 변형은 그 패턴의 다른 그림만을 방지 할 수 있습니다.

효과를 얻으려면 브러시에 장면 좌표의 점 사이의 거리를 제어하는 ​​매개 변수가 있어야합니다. rect의 paint() 메소드에서 현재 뷰 확대/축소 인수 (paint() 메소드의 style 인수를 통해)에 따라이 매개 변수 값을 설정할 수 있습니다.

QBrush가 이러한 매개 변수를 제공한다고 생각하지 않기 때문에 이전 단락에서 설명한대로 거리를 계산하여 점을 직접 그려야합니다. 파이썬을 끝내면 도트 로스가 발생하면 속도가 느려질 수 있지만 다시 PyQt5는 일반적으로 상당히 인상적인 성능을 보입니다.

점에 대한 원점을 선택해야하는 것은 아닙니다 (모서리 나 중심은 일반적인 선택 사항입니다). 확대 할 때 원점을 향해 점이 "슬라이드"됩니다. 더 많은 점은 " 반대쪽 끝/모서리에 "추가"됩니다. 효과를 좋아하지 않을 가능성이 높고 구현하기가 쉽지 않으므로 그라디언트 또는 알파 값과 같은 점을 기반으로하지 않는 다른 시각 효과를 고려할 수 있습니다. setDashPattern()과 같은 다른 접근법이 있거나 뷰 좌표에서 나머지를 그리기는하지만 그만한 가치는 없을 것입니다.

+0

글쎄, 그것은 가능하지 않을 수도 있다는 또 다른 의견을 듣는 것이 좋다. 나는 단지 알파 값을 사용하는 것을 생각하지 않았다. 그것은 완벽한 해결책 일 것이다. 디스플레이의 전반적인 목표는 다른 회색 레벨에서 다른 다각형을 표시하는 것입니다. 표준 브러시 패턴이 '정상'스케일로 작동했기 때문에 아직 알파 값을 생각조차하지 못했습니다. 고마워요. 좋은 결과를 얻으면 여기에 다시 올리겠습니다. –

+0

예, 알파가 최상의 솔루션이었습니다. 그 아이디어를 가져 주셔서 감사합니다. 돌이켜 보면 항상 분명해 보인다! 정확한 해결책을 좁히기 위해 별도의 답변을 올렸습니다 (그렇게 할 수있을 때 받아 들일 것입니다). –

+0

듣기 좋습니다. 비록 내가 쓴 것은 다른 각도에서 문제를 보게하고 다른 질문 (결국 당신이 답을 알고 있음)으로 끝났습니다. 그러나 나는 당신의 선택을 존중하며, 가장 중요한 것은 당신이 그 토끼 구멍을 내려 가지 않았다는 것입니다. – Schollii

1

감사합니다. Schollii for the lead : 알파 값을 설정하면 빠른 해결책을 얻을 수 있습니다. 나는 다양한 회색 스케일을 표현하기 위해 다양한 알파 값을 사용하여 검정색으로 갔다. 당신이 다른 음영 모든 n에 다른 항목이있는 경우

, 당신은 항목의 목록을 걸을 수 : 35이 원하는 얻을 수 있도록 좋은 모습을 기준으로 선택

myItem.setBrush(QBrush(QColor(0,0,0,35*n))) 

한 항목에서 다음 항목으로의 회색 레벨 분리 정도.

서브 클래 싱 및 변환보다 훨씬 복잡합니다.