2009-06-24 25 views
8

Sto creando alcuni dati grafici che mostrano widget nel Qt4 e ho avuto la tentazione di usare il QGraphicsScene per esso, creare QGraphicsItem s per gli elementi dei dati, eccCome devo usare un QGraphicsScene con layout e widget

Tuttavia, Volevo aggiungere alcuni livelli di controlli (ad esempio barre di scorrimento, zoom + altri pulsanti - Voglio farlo in uno stile simile ad esempio. Google Maps, cioè i dati verrebbero visualizzati in tutto il widget, e i pulsanti sarebbero essere mostrato in cima a loro) al widget. Quindi ho pensato che fosse possibile aggiungerli alla scena (forse come un bambino di uno QGraphicsGroupItem che verrebbe mostrato sui dati). Ma voglio che si spostino a & ridimensionando quando ridimensiono l'intero widget, quindi dovrei usare un QGraphicsLayout per gestirli. Ma a questo punto, ho scoperto che le cose sono piuttosto complicate.

Il problema è che quando si utilizza QGraphicsLayout, i seguenti vincoli tengono:

  1. Solo un QGraphicsWidget può essere gestito da un layout
  2. QGraphicsLayout può essere utilizzato solo per gestire figli di un QGraphicsWidget

Ciò significa che dovrei creare i miei controlli come QGraphicsWidget s, aggiungere un livello superiore QGraphicsWidget al widget di dati e gestire t lui stesso la dimensione di questo widget di primo livello.

Quindi voglio chiedere:

  1. sarebbe non un approccio classico (vale a dire utilizzare vecchie widget semplici per tutti i controlli, e utilizzare QGraphicsScene solo per la visualizzazione dei dati.) Essere più ragionevole?

  2. C'è qualche vantaggio nell'uso di QGraphicsScene in questo caso (prestazioni o semplicità ...)?

  3. Come utilizzare QGraphicsScene per sfruttare i suoi punti di forza?

risposta

1

Se si pensa che QGraphicsScene (o qualsiasi altro widget che avete) è appropriato per la maggior parte del display, usare quella. Ciò che abbiamo fatto in passato per cose simili è creare un widget personalizzato che erediti (in un modo o nell'altro) da QWidget e posizionare i widget di controllo in un layout su quel widget. Ciò significa che l'intero widget sta disegnando tutto ciò che si desidera venga disegnato, e i widget di controllo sono in primo piano, ridimensionando l'intero widget.

In alternativa, un paio di volte abbiamo avuto layout un po 'troppo complicati per i widget di layout da gestire facilmente. Invece di creare un layout personalizzato, li abbiamo semplicemente posizionati senza layout e spostati nel codice sull'evento di ridimensionamento. Funziona altrettanto bene.

+0

Il problema più grande con QGraphicsScene è che non è in realtà un widget. È qualcosa come una collezione di elementi (come rettangoli, ellissi ...) che sono disegnati automaticamente, possono essere ingranditi, ecc. Quello che descrivi è il classico, semplice vecchio modo di widget, e probabilmente mi limiterò a questo.Volevo usare la funzionalità "lucida e nuova", ma al secondo pensiero, non mi sembra così brillante, tranne che qualcuno mi dimostra che è sbagliato :) – jpalecek

+0

jpalecek: controlla la demo del widget "orologi" @ http: // www.qtsoftware.com/developer/pimp-my-widgets-developer-contest .. Non c'è niente di speciale nell'avere un widget di clock, ma l'implementazione è fatta con QGraphics (Scene | Widget | View | Item). – rasjani

+0

@jpalecek: Non pensavo che un QGraphicsScene fosse un widget, motivo per cui ho detto di ereditare "in un modo o nell'altro". Ma tu hai un QGraphicsView (o qualcosa di simile), giusto? Probabilmente vuoi mettere i tuoi widget su questo, a meno che tu non voglia che si trasformino con la tua scena. Penso che in questo caso il semplice vecchio modo widget sia più semplice e diretto. –

6

Dal momento che Qt 4.4 è possibile incorporare i widget classici in un QGraphicsScene utilizzando QGraphicsProxyWidget:

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