2012-07-18 17 views
7

Nella nostra applicazione, abbiamo un numero variabile di dockwidgets perché alcuni di essi sono aggiunti da plugin caricati in fase di runtime. Non tutte le dockwidgets devono essere necessariamente visibili allo stesso tempo. Questo dipende fortemente da cosa l'utente sta lavorando e quali plugin sono attivi.Come evitare brutte sovrapposizioni con troppe dockwidgets in QMainWindow?

Tuttavia, se vengono aggiunti troppi dockwidgets a livello di codice con addDockWidget(...), iniziano a sovrapporsi l'un l'altro (non in termini di schede, ma in termini di contenuto di un dipinto sull'area di uno diverso, che ovviamente sembra rotto).

Overlapping dockwidgets

L'utente può spostare i dockwidgets per dockareas che hanno ancora spazio sinistra, ma la finestra layout/principale impedisce correttamente (untabbed) ri-aggiunta al dockarea "affollato".

Facciamo permettono banchine a schede per consentire all'utente di organizzare i dockwidgets una richiesta, ma non vogliamo attivare QMainWindow::ForceTabbedDocks poiché ciò limitare il numero di dockwidgets contemporaneamente visibili troppo (uno per ogni zona del molo).

Come posso evitare questo o meglio controllare come vengono aggiunti i dockwidgets?

risposta

5

Non rispondere direttamente alla tua domanda, ma potrebbe valere la pena dimenticarsi di Qt e pensare a come dovrebbe funzionare l'intera interazione. Quali sono le aspettative dell'utente? Cosa dovrebbe accadere se 10 diversi plugin diventano attivi? Dovrebbero essere agganciati o dovrebbero essere mobili o dovrebbero diventare finestre di aggancio pin -abili con stato iniziale come un piccolo pulsante sui bordi MainWindow? Penso che una volta che fai il lavoro di base e trovi i mock-up dell'interfaccia utente, puoi iniziare a guardare Qt e capire se Qt fornisce un modo diretto per sviluppare quell'interfaccia e se non quali componenti aggiuntivi dovrai sviluppare per far funzionare l'interfaccia.

Dalla mia esperienza personale, avevo sviluppato un'interfaccia simile molto indietro ma in MFC. Il modo in cui lo facevamo era che alcune delle finestre ancorate erano considerate come dovevano avere e che sarebbero venute fuori come attraccate.Poi c'era una serie di finestre che non avevano bisogno di essere sempre visibili ma dovevano essere rapidamente disponibili e il loro stato iniziale era come una finestra di dock pin-in nascosta, il che significava che venivano visualizzati come pulsanti sul bordo MainWindow. Infine c'era un terzo set che non era richiesto dall'utente e che poteva essere richiamato da File-> Visualizza Menu. Una volta che l'utente lo ha reso visibile, l'utente in genere lo assegnerebbe a uno dei primi due gruppi o lo terrà a galla. L'intera configurazione è stata salvata in un file di configurazione e da lì in poi ogni volta che il plugin è stato caricato/diventato attivo, è stato utilizzato l'ultimo stato utilizzato della finestra di aggancio associata. Anche se ha comportato un po 'di lavoro extra, ma il risultato finale è stato per la soddisfazione di tutti gli utenti.

+1

Grazie. Immagino che questo sia un buon consiglio. Questo potrebbe essere un buon esempio per cui è sempre una buona idea fare un passo indietro e ripensare il design generale e il quadro generale quando ci si perde nei dettagli tecnici. –

2

Hai provato setDockOptions(QMainWindow::AllowNestedDocks)? Non posso testarlo ora ma potrebbe essere d'aiuto. Per impostazione predefinita, QMainWindow::dockOptions è impostato su AnimatedDocks | AllowTabbedDocks modo si vorrebbe qualcosa di simile

setDockOptions(QMainWindow::AllowNestedDocks | QMainWindow::AnimatedDocks | QMainWindow::AllowTabbedDocks) 

EDIT: Se si hanno troppi problemi, si può andare su questo nel modo sbagliato. Invece di utilizzare i dock, potresti provare a utilizzare QMdiArea con QMdiWindow. Questo potrebbe non funzionare per il tuo programma, ma è qualcosa su cui riflettere.

+0

Lo proverò, anche se non sono sicuro che mi piaccia 'AllowNestedDocks'. Come è ora, può già essere abbastanza fastidioso a volte che le dockwidgets iniziano a * snap * nelle diverse aree, quando si desidera semplicemente spostare un widget mobile. Abilitare il nesting aumenterà anche il numero di possibili aree di banchina, no? –

+0

Sì, lo farà. La documentazione qt afferma che è buona per molti banchini ma che può essere fastidiosa. –

+0

È anche peggio. Prima di tutto, non funziona. Con un singolo "livello" di dockwidgets, è lo stesso di prima. Ma se nidifico in dockwidgets l'uno accanto all'altro e poi aggiungo a livello di codice un altro dockwidget a quell'area, si sovrappone solo ** entrambi ** dockwidgets nidificati:/ –

1

Questa è la soluzione che ho provato:

  1. ho creato in QtCreator un progetto vuoto con una finestra, un menu minimalista con l'etichetta "Nuova Darsena" e un DockWidget nome dockWidget

  2. Questo è il triggered() gestore per la mia voce di menu:

    void MainWindow::on_actionNew_Dock_triggered() 
    {  
        QDockWidget* w = new QDockWidget("Demo", ui->dockWidget); 
        this->addDockWidget(Qt::LeftDockWidgetArea,w); 
        this->tabifyDockWidget(ui->dockWidget,w); 
    } 
    

tabifyDockWidget(QDockWidget* first, QDockWidget* second) è un metodo QMainWindow che impila il secondo dockwidget sul primo. Spero che sia d'aiuto ...

+0

Tuttavia, allora dovrei prima controllare se c'è già un widget dock su quel lato emm, se ce ne sono molti, decidi quale da tabificare. Ma anche questo non risolverà il problema immagino: supponiamo che ci siano due dockwid in 'LeftDockWidgetArea'. W.r.t loro minimumSize, occupano tutto lo spazio disponibile. Uno è piccolo, uno è grande. Aggiungo una dockwidget piuttosto grande. Se ora scelgo il piccolo da inserire nella scheda con il mio nuovo dockwidget, ho paura di incontrare esattamente gli stessi problemi (due dockwidgets affiancati, entrambi troppo grandi, quindi Qt sovrascrive il minimo Size e causa la brutta sovrapposizione. –

+0

O am Mi manca qualcosa? Forse dobbiamo ridefinire l'intero "processo" di quando, come e dove è possibile aggiungere i dockwidgets ... –

+0

È possibile implementare politiche di tabulazione/aggancio a livello di plugin. Suppongo, tuttavia, che i plugin derivino da 'QWidget' e viene impostato come widget principale di' QDockWindow'.Se questo è il caso, l'antenato del plugin comune potrebbe escogitare un criterio di docking/posizionamento di base, che può essere modificato dai loro discendenti. –

Problemi correlati