Wie soll ich einen QGraphicsScene mit Layouts und Widgets verwenden?

8

Ich erstelle ein grafisches Datenanzeige-Widget in Qt4 und ich war versucht, die QGraphicsScene dafür zu verwenden, QGraphicsItem s für die Datenelemente usw. zu erstellen.

Ich wollte jedoch 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 & amp; Wenn ich die Größe des gesamten Widgets ändere, ändere ich die Größe, also sollte ich ein QGraphicsLayout für die Verwaltung verwenden. Aber an diesem Punkt habe ich entdeckt, dass die Dinge ziemlich kompliziert sind.

Das Problem besteht darin, dass bei Verwendung von QGraphicsLayout folgende Einschränkungen gelten:

  1. Nur ein QGraphicsWidget kann von einem Layout
  2. verwaltet werden
  3. QGraphicsLayout kann nur verwendet werden, um Kinder eines QGraphicsWidget zu verwalten

Das bedeutet, dass ich meine Steuerelemente als QGraphicsWidget s erstellen, ein Toplevel QGraphicsWidget zum Datenwidget hinzufügen und die Größe dieses Toplevel-Widgets selbst verwalten müsste.

Ich möchte also fragen:

  1. Wäre nicht ein klassischer Ansatz (z. B. einfache alte Widgets für alle Steuerelemente verwenden und QGraphicsScene nur für die Anzeige der Daten verwenden) vernünftiger?

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

  3. Wie sollte ich QGraphicsScene verwenden, um seine Stärken zu nutzen?

jpalecek 24.06.2009, 14:26
quelle

2 Antworten

6

Seit Qt 4.4 können Sie klassische Widgets in QGraphicsScene einbetten, indem Sie QGraphicsProxyWidget verwenden:

%Vor%     
Luper Rouch 29.07.2009 02:14
quelle
1
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine völlig andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123userinterface ___ Das System, über das Menschen mit einem Computer interagieren, wird "UI" genannt, was für "Benutzeroberfläche" steht. Dieses Tag kann für UI-bezogene Programmierfragen verwendet werden. Beachten Sie, dass es eine separate Stack Exchange-Site für Benutzeroberflächen, Interaktionen mit dem Computer und Benutzererlebnis gibt: http://ux.stackexchange.com. ___ tag123qt ___ Qt ist ein plattformübergreifendes Anwendungsentwicklungs-Framework, das häufig für die Entwicklung von Anwendungssoftware verwendet wird, die auf verschiedenen Software- und Hardwareplattformen ohne oder mit nur geringer Änderung der zugrundeliegenden Codebasis ausgeführt werden kann. Qt ist sowohl mit kommerziellen als auch mit Open-Source-Lizenzen verfügbar. ___ tag123qt4 ___ Fragen speziell zur veralteten Version 4.x.x der Qt C ++ - GUI-Bibliothek. Wenn Ihre Frage für die aktuelle Hauptversion von Qt gilt, verwenden Sie das Tag [qt]. ___ qstntxt ___

Ich erstelle ein grafisches Datenanzeige-Widget in Qt4 und ich war versucht, die QGraphicsScene dafür zu verwenden, QWidget s für die Datenelemente usw. zu erstellen.

Ich wollte jedoch 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 %code% , das über den Daten angezeigt würde). Aber ich möchte, dass sie sich bewegen & amp; Wenn ich die Größe des gesamten Widgets ändere, ändere ich die Größe, also sollte ich ein %code% für die Verwaltung verwenden. Aber an diesem Punkt habe ich entdeckt, dass die Dinge ziemlich kompliziert sind.

Das Problem besteht darin, dass bei Verwendung von %code% folgende Einschränkungen gelten:

  1. Nur ein %code% kann von einem Layout
  2. verwaltet werden
  3. %code% kann nur verwendet werden, um Kinder eines %code% zu verwalten

Das bedeutet, dass ich meine Steuerelemente als %code% s erstellen, ein Toplevel %code% zum Datenwidget hinzufügen und die Größe dieses Toplevel-Widgets selbst verwalten müsste.

Ich möchte also fragen:

  1. Wäre nicht ein klassischer Ansatz (z. B. einfache alte Widgets für alle Steuerelemente verwenden und %code% nur für die Anzeige der Daten verwenden) vernünftiger?

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

  3. Wie sollte ich %code% verwenden, um seine Stärken zu nutzen?

___ qstnhdr ___ Wie soll ich einen QGraphicsScene mit Layouts und Widgets verwenden? ___ tag123qgraphicsview ___ Eine QGraphicsView ist eine Klasse aus dem Qt-Toolkit, die ein Widget zum Anzeigen der Inhalte eines QGraphicsScene bereitstellt. ___ answer1197751 ___

Seit Qt 4.4 können Sie klassische Widgets in %code% einbetten, indem Sie %code% verwenden:

%Vor%     
___ antwort1040118 ___

Wenn Sie denken, dass %code% (oder ein anderes Widget, das Sie haben) für die meisten Ihrer Anzeigen geeignet ist, verwenden Sie das. 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 %code% 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 stehen darüber, wobei die Größe geändert wird, wenn die Größe des gesamten Widgets geändert wird.

Alternativ hatten wir einige 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.

    
___
Caleb Huitt - cjhuitt 24.06.2009 18:32
quelle