2015-02-03 2 views
1

QGraphicsScene에 노드 묶음을 배치합니다. 노드는 기본 타원 (QGraphicsEllipseItems)입니다. 합리적으로 잘 작동합니다.다른 속성을 변경하지 않고 GraphicsScene에서 GraphicsItem의 위치 조정

그러나 타원 크기를 조정하는 방법을 알고 싶습니다. 현재 필자는 하드 코딩 된 반경을 80 단위로 사용하고 있는데 타원형 수가 수백 개에 이르면 잘 작동하지만 몇 천 개의 타원형을 사용하면 장면의 크기에 비해 너무 작아 보입니다. tiny ellipses 반대로 장면이 조금 밖에없는 경우 10 줄임표가 커집니다.

나는 타원의 크기와 장면의 타원수 및 장면의 크기의 균형을 잘 조절하는 수식을 찾고자합니다.

또한 축소 및 타원형으로 타원형을 적절하게 유지하고 싶습니다.

균형 잡힌 배열을 가장 잘 달성하는 방법에 대해 조언 해 줄 수있는 사람은 누구입니까?

+0

노드가 작기 때문에 노드가 작기 때문에 쉽게 더 크게 만들 수 있습니다 (setSceneRect 또는 Qt가 장면을 중앙에 유지하는 것을 잊지 마십시오). 확대하는 동안 타원을 적당한 크기로 유지하려면 내 대답을 참조하십시오. – Trilarion

답변

0

화면에는 특정 크기의 화면이있는 동안 장면에 넣은 모든 그래픽 항목을 묶는 특정 경계 사각형이 있습니다.

장면과보기 사이에는 변형 행렬 (배율, 회전, 전단 및 평행 이동에 대한 2x3)이 있습니다. 너는 QGraphicsView.transform()에 의하여 그것을 얻을 수 있는다.

플롯에 장면을 늘리는 더 많은 타원을 넣었지만 여전히 모든 장면을 보려는 경우 축소해야하므로 타원의 너비도 줄어 듭니다.

당신은 원하지 않습니다. 이제 규모가 변경 될 때마다 (현재 배율 인수에 따라) 크기를 조정하지 않는 것이 좋습니다. 음, 이것은 아마도별로 효율적이지 않습니다.

더 나은 해결책은보기의 눈금을 변경하지 않고 줌을 고정 된 상태로 수동으로 위치를 조정하는 것입니다. 그렇게하면 위치를 제외한 항목의 속성을 변경하지 않아도됩니다.

enter image description here

: 당신이 위치를 확장 할 수 있습니다 후이처럼 보이는 마우스 휠로

from PySide import QtGui, QtCore 
import random 

class MyGraphicsView(QtGui.QGraphicsView): 

    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 

    def wheelEvent(self, event): 
     if event.delta() > 0: 
      scaling = 1.1 
     else: 
      scaling = 1/1.1 

     # reposition all items in scene 
     for item in self.scene().items(): 
      r = item.rect() 
      item.setRect(QtCore.QRectF(r.x() * scaling, r.y() * scaling, r.width(), r.height())) 

app = QtGui.QApplication([]) 

scene = QtGui.QGraphicsScene() 
scene.setSceneRect(-200, -200, 400, 400) 
for i in range(100): 
    rect = QtCore.QRectF(random.uniform(-180, 180), random.uniform(-180, 180), 10, 10) 
    scene.addEllipse(rect) 

view = MyGraphicsView(scene) 
view.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) 
view.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) 
view.resize(400, 400) 
view.show() 

app.exec_() 

:

예 (PySide와 파이썬 3 만 PyQt는 파이썬이 쉽게 조절을 사용)

크기와 타원 수의 균형에 관해서는 - 여러분이 선택한 것이 전부입니다. 일반적인 규칙은 없습니다. 줄임표를 타원 사이의 거리보다 크게 만들지 않거나 겹치게하는 것이 좋습니다. 일반적으로 뷰의 픽셀 크기가 1 : 1 인 장면 좌표로 작업합니다 (위 예제에서와 같이 뷰의 400 픽셀 너비, 장면 사각형의 400 단위 너비). 그러면 10의 타원 크기가 10 픽셀이라는 것을 쉽게 상상할 수 있습니다. 더 많이 원하면 더 사용하고, 원한다면 덜 사용합니다. 그러나 그것에 대한 규칙은 없습니다. 원하는대로 할 수 있습니다.

관련 문제