2009-06-24 12 views
8

tworzę jakieś dane graficzne wyświetlanie widżetu w Qt4 i miałem ochotę użyć QGraphicsScene dla niej tworzyć QGraphicsItem s dla pozycji danych itpJak należy użyć QGraphicsScene z układów i widżetów

jednak Chciałem dodać warstwę kontrolek (np. Paski przewijania, zoom + inne przyciski - chcę zrobić to w stylu podobnym do np. Google Maps, to znaczy, że dane będą wyświetlane na całym widżecie, a przyciski będą pokaż się na nich) do widgetu. Pomyślałem więc, że może być możliwe dodanie ich do sceny (być może jako dziecko z QGraphicsGroupItem, które byłoby pokazane nad danymi). Ale chcę, aby przesuwały się po zmianie wielkości widżetu na &, więc do zarządzania nimi powinienem użyć QGraphicsLayout. Ale w tym momencie odkryłem, że rzeczy są dość skomplikowane.

Problemem jest to, że podczas korzystania QGraphicsLayout następujące ograniczenia przytrzymanie:

  1. Tylko QGraphicsWidget mogą być zarządzane przez układ
  2. QGraphicsLayout mogą być wykorzystywane wyłącznie do zarządzania dzieci o QGraphicsWidget

Co oznacza, że ​​będę musiał utworzyć moje formanty jako QGraphicsWidget s, dodać najwyższy poziom QGraphicsWidget do widgetu danych i zarządzać t Rozmiar samego tego widgetu najwyższego poziomu.

Więc chcę zapytać:

  1. Czy nie jest to klasyczne podejście (tj używać zwykłego starych widgety dla wszystkich elementów sterujących i używać QGraphicsScene tylko do wyświetlania danych.) Będzie bardziej rozsądne?

  2. Czy jest jakaś korzyść z używania QGraphicsScene w tym przypadku (wydajność lub prostota ...)?

  3. Jak wykorzystać QGraphicsScene, aby wykorzystać swoje mocne strony?

Odpowiedz

1

Jeśli uważasz, że QGraphicsScene (lub cokolwiek innego widget masz) jest odpowiedni dla większości z ekranu, użyj tego. W przeszłości zrobiliśmy coś podobnego w celu utworzenia niestandardowego widgetu, który dziedziczy (w ten czy inny sposób) z QWidget i umieszcza kontrolne widżety w układzie na wierzchu tego widgetu. Oznacza to, że cały widget rysuje cokolwiek, co chcesz narysować, a widżety kontrolne są na nim wyższe, zmieniając rozmiar podczas zmiany rozmiaru całego widżetu.

Alternatywnie, kilka razy mieliśmy układy, które były nieco zbyt skomplikowane, aby widżety układu mogły łatwo sobie z nimi poradzić. Zamiast tworzyć niestandardowy układ, umieściliśmy je bez żadnego układu i przenieśliśmy je w kodzie w przypadku zmiany rozmiaru. Działa równie dobrze.

+0

Największym problemem z QGraphicsScene jest to, że w rzeczywistości nie jest widget. Jest to coś w rodzaju kolekcji elementów (takich jak prostokąty, elipsy ...), które są rysowane automatycznie, mogą być powiększane itd. To, co opisujesz, to klasyczny, prosty, stary sposób wyświetlania widgetów, a ja zapewne się do tego przyzwyczaję.Chciałem użyć funkcjonalności "lśniącej i nowej", ale z drugiej strony nie wygląda mi to tak lśniąco, chyba że ktoś mi udowodni, że się mylę :) – jpalecek

+0

jpalecek: sprawdź demo widgetu "zegary" @ http: // www.qtsoftware.com/developer/pimp-my-widgets-developer-contest .. Nic dziwnego w tym, że masz widget zegara, ale implementacja odbywa się za pomocą QGraphics (Scene | Widget | View | Item). – rasjani

+0

@jpalecek: Nie sądziłem, że QGraphicsScene jest widgetem, dlatego powiedziałem, że dziedziczy "tak czy inaczej". Ale masz QGraphicsView (lub coś podobnego), prawda? Prawdopodobnie chcesz umieścić na nim swoje widżety, chyba że chcesz, aby zmieniały się wraz ze sceną. Myślę, że w tym przypadku zwykły, stary sposób wyświetlania jest prostszy i bardziej prosty. –

6

Od Qt 4.4 można osadzić w klasyczne wzory z QGraphicsScene za pomocą QGraphicsProxyWidget:

QWidget *widget = new QWidget; 
QGraphicsScene scene; 
QGraphicsProxyWidget *proxy = scene.addWidget(widget); 
Powiązane problemy