2009-06-24 3 views
8
내가 QT4에 위젯을 표시 일부 그래픽 데이터를 만드는거야

와 QGraphicsScene를 사용해야하고 나는, 그것을위한 QGraphicsScene 사용어떻게, 내가 레이아웃과 위젯

그러나 데이터 항목 등에 QGraphicsItem의를 만들 유혹했다 스크롤 바, 줌 + 다른 버튼 등의 컨트롤 레이어를 추가하고 싶습니다. 예를 들어 Google지도와 비슷한 스타일로 만들고 싶습니다. 즉, 데이터가 위젯 전체에 표시되고 버튼이 위젯에 꼭대기에 표시). 그래서 나는 그들을 현장에 추가하는 것이 가능할 수도 있다고 생각했습니다. 아마도 데이터 위에 표시 될 QGraphicsGroupItem의 자식으로 생각할 수 있습니다. 하지만 전체 위젯의 크기를 조정할 때 & 크기를 변경하기를 원합니다. 따라서이를 관리하기 위해 QGraphicsLayout을 사용해야합니다. 그러나이 시점에서 나는 물건이 꽤 복잡하다는 것을 발견했다.

문제는 QGraphicsLayout를 사용하는 경우, 다음과 같은 제약 조건을 유지한다는 것입니다 :

  1. QGraphicsWidget이 레이아웃 관리 할 수 ​​
  2. QGraphicsLayoutQGraphicsWidget
의 아이들을 관리하는 데 사용할 수 있습니다

즉, 내 컨트롤을 QGraphicsWidget s로 만들고, 위젯 QGraphicsWidget을 데이터 위젯에 추가하고 t를 관리해야합니다. 그는 자신이 톱 레벨 위젯의 크기입니다.

그래서 내가 물어보고 싶은 :

  1. 고전적인 접근 방식 (즉, 모든 컨트롤에 대한 일반 오래된 위젯을 사용하고 데이터 만 표시 QGraphicsScene를 사용합니다.) 더 합리적 일을하지 않을까요?

  2. 이 경우 QGraphicsScene을 사용하면 어떤 장점이 있습니까 (성능 또는 단순성 ...)?

  3. QGraphicsScene의 장점을 활용하려면 어떻게해야합니까?

답변

1

당신이 QGraphicsScene (또는 다른 어떤 위젯 당신이)가 디스플레이의 대부분 적절하다고 생각하는 경우, 그것을 사용합니다. 이전에 비슷한 점이 있었지만 QWidget에서 상속하는 맞춤 위젯을 만들고 해당 위젯의 레이아웃에 컨트롤 위젯을 배치했습니다. 즉, 전체 위젯이 원하는대로 그려지고 컨트롤 위젯이 그 위에 있으며 전체 위젯의 크기가 조정되면 크기가 조정됩니다.

또는 몇 번 우리는 레이아웃 위젯이 쉽게 처리하기에 너무 복잡한 레이아웃을 사용했습니다. 커스텀 레이아웃을 만드는 대신 레이아웃이없는 레이아웃을 배치하고 resize 이벤트의 코드로 레이아웃을 옮겼습니다. 그것은 잘 작동합니다.

+0

QGraphicsScene의 가장 큰 문제는 실제로 위젯되지 않는 것입니다. 이것은 자동으로 그려지는 항목들 (사각형, 타원 등)의 모음과 비슷합니다. 당신이 묘사하는 것은 고전적이고 평범한 위젯 방식이며, 아마도 그것에 충실 할 것입니다.나는 "반짝이고 새로운"기능을 사용하고 싶었지만, 두 번째 생각에서 누군가가 나를 틀리게 증명하는 것을 제외하고는 반짝 반짝 빛나지 않습니다 :) – jpalecek

+0

jpalecek : "시계"위젯 데모 @ http : //를 확인하십시오. www.qtsoftware.com/developer/pimp-my-widgets-developer-contest .. 시계 위젯을 가지고있는 것에 대한 환상은 없지만,이를위한 구현은 QGraphics (Scene | Widget | View | Item)로 수행됩니다. – rasjani

+0

@jpalecek : 저는 QGraphicsScene이 위젯이라고 생각하지 않았습니다. 그래서 나는 "한 가지 방법"을 상속 받았다고 말합니다. 하지만 당신은 QGraphicsView (또는 비슷한), 맞죠? 장면으로 변형시키지 않으려면 위짓을 그 위에 올려 놓고 싶을 것입니다. 나는이 경우 평범한 구식 위젯 방식이 더 간단하고 직선적이라고 생각한다. –

6

Qt는 4.4 이후 당신은 QGraphicsProxyWidget를 사용하여 QGraphicsScene 클래식 위젯을 추가 할 수 있습니다 :

QWidget *widget = new QWidget; 
QGraphicsScene scene; 
QGraphicsProxyWidget *proxy = scene.addWidget(widget);