2012-05-26 2 views
2

모든 클라이언트 영역을 차지하는 QGraphicsView 안에 QMainWindows가 있습니다. 뷰 내에서 일부 QGraphicsTextItem 항목을 렌더링합니다. 주 창 크기를 조정하지 않는 한 모든 것이 작동합니다. 내가 그렇게하면, 항목은 원래 위치에 머무르고 새로운 정확한 위치로 이동하지 않습니다. 기본적으로 내가 무엇을 할 것이라고하는 것은 필요한 경우 확장 레이아웃 위젯처럼 행동을 가지고있다크기 조정 QGraphicsView가 위젯을 이동하지 않습니다.

UPDATE 1

enter image description here

업데이트 2enter image description hereenter image description here

UPDATE 3

다음 코드를 사용하면 버튼이 클라이언트 영역의 오른쪽에 배치됩니다. 944는 QGraphicsView의 Qt Designer에서 정의 된 너비입니다. xPos를 10에서 시작하고 새 버튼을 추가 할 때마다이를 늘리면서 영역 왼쪽에있는 위젯에 대해 동일한 코드가 있습니다. 창 크기를 조정하면 왼쪽 위젯은 항상 새 위치로 이동하고 오른쪽은 동일한 동작을하지 않습니다. 왜?

this->ui.setupUi(this); 

qreal xPos = 944 - 10; 

QGraphicsTextItem *myButton1 = new QGraphicsTextItem("my text"); 

myButton1 ->adjustSize(); 
myButton1 ->setPos(xPos - myButton1 ->textWidth(), 10); 

xPos -= myButton1 ->textWidth(); 

this->m_graphicsScene->addItem(myButton1); 


QGraphicsTextItem *myButton2 = new QGraphicsTextItem("my text 2"); 

myButton2 ->adjustSize(); 
myButton2 ->setPos(xPos - myButton2->textWidth(), 10); 

xPos -= myButton2 ->textWidth(); 

this->m_graphicsScene->addItem(myButton2); 
+0

:

는 레이아웃에 QGraphicsItem을 통합하고자하는 사람의 그 같은 상황 때문에 자세한 내용은이 질문을 참조하십시오. 디스플레이의 배율을 조정해야합니까? 마술의 "중계"가 발생해야합니까? 즉, 중심에 배치 된 항목은 가운데에 머물러 있어야하지만 지오메트리는 유지해야합니다. – Mat

+0

스크린 샷에서 볼 수 있듯이 클라이언트 영역의 오른쪽에는 몇 가지 사항이 있습니다. 창 크기를 조정하면 상황이 올바르게 움직이지 않지만 이전 위치에 머물러있게됩니다. – Stefano

+0

보기에있는 다른 것들은 어떻습니까? 나는 모든 것이보기의 왼쪽으로 옮기길 원하지 않는다고 생각합니다. 좀 더 설명 해주십시오. – Mat

답변

3

QGraphicsView는 장면 내부의 QGraphicsItem 개체에 직접 연결되어 있지 않습니다. 그 유일한 목적은 뷰포트에서 장면 조각을 시각화하고 사용자 상호 작용을 장면에 전달하는 것입니다. 레이아웃이 없지만 QGraphicsWidget과 함께 사용하기 위해 레이아웃이 추가되었습니다 (단, 특별한 필요 사항입니다). 그럼에도 불구하고 장면의 항목 위치와는 대조적으로 (이는 서로 전혀 관련이없는)보기의 번역과 관련됩니다.

QGraphicsView를 서브 클래 싱하고 보기에 -implement resizeEvent 다음 resizeEvent에서 http://qt-project.org/doc/qt-4.8/qgraphicsview.html#resizeEvent
, 당신은 크기 조정에 따라 양만큼 뷰를 번역하는 것입니다 : http://qt-project.org/doc/qt-4.8/qgraphicsview.html#translate

은 본질적으로, 당신은 당신의 정의를 QGraphicsView 내 자신의 레이아웃 매니저 기능을 만들 수 있습니다.

업데이트

난 당신이 무슨 뜻인지 깨닫는다 sceneRect이를 QGraphicsView보다 큰 경우, 그것은 스크롤 막대를 사용하여 크기 조정을 중심으로보기를 유지하지 않습니다. 이상적으로, 컨텐츠를 스크롤 할 필요가없는 그래픽 장면 유형을 생성하는 경우 sceneRect를 기본값으로 두거나 뷰포트의 크기로 설정해야합니다.

그렇지 않으면 resizeEvent를 사용하는 방법에 대한 기본적인 예가 있습니다. 이 PyQt는에 있지만 나는 당신이 번역 할 수 있습니다 확신 :

class Dialog(QtGui.QDialog): 

    def __init__(self): 
     super(Dialog, self).__init__() 
     self.resize(640,480) 
     layout = QtGui.QVBoxLayout(self) 

     self.scene = QtGui.QGraphicsScene(self) 
     self.scene.setSceneRect(-500,-500,1000,1000) 
     self.view = GraphicsView(self) 
     self.view.setScene(self.scene) 
     layout.addWidget(self.view) 

     text = self.scene.addText("Foo") 

     self.view.updateCenter() 


class GraphicsView(QtGui.QGraphicsView): 

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

    def resizeEvent(self, event): 
     super(GraphicsView, self).resizeEvent(event) 
     if self._center: 
      self.centerOn(self._center) 

    def updateCenter(self): 
     center = self.geometry().center() 
     self._center = self.mapToScene(center) 

그것은 당신이 updateCenter()를 호출 할 때 관심있는 장면 지점을 저장합니다. 그런 다음보기의 크기가 조정될 때마다 해당 장면 점으로 중심을 맞 춥니 다.

업데이트 2 : 사진 게시물 및 업데이트

당신이 정말 QGraphicsScene 정상는 QWidget 행동의이 종류를해야하는 경우

, 후에는 레이아웃과 함께, 당신은 지원 레이아웃을 QGraphicsWidgets,보고되어야한다.그런 다음 하나의 커다란 루트 "캔버스"위젯을 만들 수 있고, 레이아웃의 내부에서 그 외 모든 것을 모두 자식으로 만들 수 있습니다. 그런 다음 루트 위젯을 적절하게 유지하는 것에 대해 걱정할 필요가 있습니다. 위의 예제를 사용하여 루트 위젯의 크기와 위치를 관리 할 수 ​​있습니다. 어떻게해야하는지 정확히 명확하지 않다
QGraphicsWidget vs. QGraphicsLayoutItem

+0

번역 기능을 구현하는 방법을 보여주는 아주 작은 예제를 써주시겠습니까? 이 후 당신의 대답을 받아 들일 것입니다 – Stefano

+0

@Stefano : 어떤 버전의 Qt를 사용하고 있습니까? 사실 실제로 예제를 만들었고 뷰의 기본 동작은 상대 위치를 유지하는 것임을 알게되었습니다. 즉, 장면의 중심에서 텍스트 항목을 만들고보기의 크기를 조정하면보기가 커질수록 가운데에 그대로 유지됩니다. 문제를 보여주는 매우 짧은 작업 예제를 게시해야한다고 생각합니다. – jdi

+0

그게 정확히 문제입니다. 윈도우즈에서 qt 4.8을 사용하고 있습니다. 예를 들어 위치 0, 100에 QGraphicsTextItem을 배치합니다.그 후 윈도우의 크기를 조정합니다 : 아이템이 움직여야하고 윈도우가 커지더라도 똑같은 위치를 유지합니다. 그러나 제 경우에는 아무것도하지 않습니다. – Stefano