2015-05-11 9 views
6

Nel mio Qt 5.3 applicazione, voglio integrare l'interfaccia grafica da un processo figlio nel mio processo di finestra principale:errori di disegno e incidente con QWidget :: createWindowContainer

  1. Il processo figlio crea un alto livello QWidget .
  2. Il processo figlio comunica il widget WId come restituito da QWidget::winId() al genitore (utilizzando IPC).
  3. Il genitore utilizza QWindow::fromWinId() e QWidget::createWindowContainer() per creare un QWidget che visualizza la GUI del processo figlio. Questo widget è incorporato nel layout di un altro widget.

Osservazioni:

  1. La GUI bambino viene visualizzata, ma non fusi correttamente: ci sono i bordi bianchi che non vengono aggiornati correttamente quando ri-dimensionamento del genitore.
  2. Se la finestra padre viene ridimensionata troppo piccola, il processo figlio si arresta in modo anomalo a causa di una violazione di accesso alla memoria nel codice di Qt.
  3. Se non si specifica un genitore con QWidget::createWindowContainer() per utilizzare invece una finestra di livello superiore separata, il figlio è incorporato correttamente.
  4. Dopo aver aperto una finestra di dialogo modale, ad esempio QMessageBox, il problema si risolve automaticamente e il figlio viene incorporato correttamente dopo il successivo ridimensionamento del genitore.

Soprattutto l'ultimo punto mi lascia perplesso. Ho provato a scoprire se l'esecuzione di QMessageBox modifica alcuni flag sul widget figlio e se riesco a simulare manualmente queste modifiche per aggirare il problema, senza fortuna.

Qualcuno ha un'idea di cosa sta succedendo qui? Cosa potrebbe fare la finestra di dialogo modale al widget che risolve il problema?

risposta

3

Prima di tutto - grazie per questa domanda. Prima di allora non sono a conoscenza di questa funzionalità in Qt. Trascorro del tempo per implementare la soluzione e ho lo stesso problema: bordo bianco.

Dopo alcune prove che cerco di fare la finestra reparenting al volo e invece bordi bianchi c'era confini del sistema operativo nativo:

native borders after reparenting

Sembra che quando la chiamata QWidget::createWindowContainer Qt ottenere dimensioni della finestra intera, visualizzazione QWidget (con dimensioni più piccole dell'intera finestra) e riempire lo sfondo con il colore bianco.

Ho trovato la soluzione per questo problema: imposta il flag della finestra Qt::FramelessWindowHint per il widget figlio prima di chiamare createWindowContainer nella finestra principale.

this->setWindowFlags(Qt::FramelessWindowHint); 

non riuscivo a riprodurre il problema con schianto dopo il ridimensionamento. Aggiungo il widget figlio al layout e funziona perfettamente.

È possibile guardare il mio example source at Git Hub.

Se non risolve il problema con l'arresto anomalo, fornire una fonte per questo problema.

NOTA: nell'esempio su GitHub eseguo figlio progetto, leggo winId dall'output di debug, modifica origine padre e avvio progetto padre.

+0

Grazie per la risposta! Visto che non sono in ufficio, proverò il tuo consiglio e darò un feedback lunedì CET. Sono abbastanza felice di vedere se la tua soluzione semplice funziona! –

+0

Yay, il 'FramelessWindowHint' corregge sia il rendering dei bordi * che * l'arresto anomalo! Sono contento che ci sia una soluzione/soluzione così semplice. Grazie, ti sei guadagnato la taglia! :) –