2009-06-24 10 views
8

ich einige Grafikdaten bin Erstellen von Anzeigen-Widget in Qt4 und ich war die QGraphicsScene für es zu benutzen versucht, erstellen QGraphicsItem s für die Datenelemente usw.Wie soll ich eine QGraphicsScene mit Layout und Widgets

jedoch Ich wollte einige Ebenen von Steuerelementen hinzufügen (z. B. Bildlaufleisten, Zoom + andere Schaltflächen - ich möchte es in einem ähnlichen Stil wie z. B. Google Maps machen, das heißt, die Daten würden über das gesamte Widget angezeigt werden, und die Schaltflächen würden auf dem Widget angezeigt werden). Also dachte ich, es wäre machbar, sie der Szene hinzuzufügen (vielleicht als Kind eines QGraphicsGroupItem, das über den Daten angezeigt würde). Aber ich möchte, dass sie sich bewegen & Größe ändern, wenn ich das gesamte Widget Größe ändern, so sollte ich eine QGraphicsLayout für die Verwaltung von ihnen verwenden. Aber an diesem Punkt entdeckte ich, dass die Dinge ziemlich kompliziert sind.

Das Problem ist, dass, wenn QGraphicsLayout verwenden, werden die folgenden Einschränkungen gelten:

  1. Nur ein QGraphicsWidget kann durch ein Layout verwaltet werden
  2. QGraphicsLayout nur verwendet werden, können Kinder ein QGraphicsWidget
zu verwalten

Das bedeutet, dass ich meine Steuerelemente als QGraphicsWidget s erstellen, eine Top-Level QGraphicsWidget zum Daten Widget hinzufügen und verwalten würde Die Größe dieses Top-Level-Widgets selbst.

So möchte ich fragen:

  1. Wäre kein klassischer Ansatz (dh für alle Kontrollen nur alte Widgets verwenden, und verwenden Sie QGraphicsScene nur für die Anzeige von Daten.) Mehr sinnvoll?

  2. Gibt es einen Vorteil bei der Verwendung QGraphicsScene in diesem Fall (Leistung oder Einfachheit ...)?

  3. Wie soll ich QGraphicsScene nutzen, um seine Stärken auszunutzen?

Antwort

1

Wenn Sie denken, dass QGraphicsScene (oder was auch immer andere Widget Sie haben) für die meisten Ihrer Anzeige geeignet ist, verwenden Sie diese. Was wir in der Vergangenheit für etwas Ähnliches getan haben, ist ein benutzerdefiniertes Widget zu erstellen, das (auf die eine oder andere Weise) von QWidget erbt und die Steuerungswidgets in ein Layout oberhalb dieses Widgets legt. Dies bedeutet, dass das gesamte Widget gezeichnet wird, was auch immer gezeichnet werden soll, und die Kontroll-Widgets sind darüber, wobei die Größe des gesamten Widgets geändert wird.

Alternativ hatten wir ein paar Mal Layouts, die für die Layout-Widgets einfach zu kompliziert waren. Anstatt ein benutzerdefiniertes Layout zu erstellen, haben wir sie einfach ohne Layout positioniert und sie im Code für das Resize-Ereignis verschoben. Es funktioniert genauso gut.

+0

Das größte Problem mit QGraphicsScene ist, dass es nicht wirklich ein Widget ist. Es ist so etwas wie eine Sammlung von Elementen (wie Rechtecke, Ellipsen ...), die automatisch gezeichnet werden, gezoomt werden können. Was du beschreibst, ist die klassische, einfache alte Widget-Methode, und ich werde wahrscheinlich daran festhalten.Ich wollte die "glänzende und neue" Funktionalität verwenden, aber bei dem zweiten Gedanken sieht es für mich nicht so glänzend aus, außer jemand beweist mich falsch :) – jpalecek

+0

jpalecek: check das "clocks" Widget demo @ http: // www.qtsoftware.com/developer/pimp-my-widgets-developer-contest .. Nichts, das auf ein Uhrwidget aber eine Implementierung für das mit QGraphics getan wird (Szene | Widget | View | Item). – rasjani

+0

@jpalecek: Ich dachte nicht, dass eine QGraphicsScene ein Widget ist, weshalb ich sagte, dass ich "auf die eine oder andere Weise" erben soll. Aber du hast eine QGraphicsView (oder etwas ähnliches), oder? Wahrscheinlich möchtest du deine Widgets darüber setzen, außer du willst, dass sie sich mit deiner Szene transformieren. Ich denke, in diesem Fall ist der einfache alte Widget-Weg einfacher und geradliniger. –

6

Seit 4.4 Qt können Sie klassische Widgets in einem QGraphicsScene einbetten QGraphicsProxyWidget mit:

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