Come rimuovere QWidgets da QSplitter
Domanda
Nella mia app hanno una finestra a spacco da un QSplitter, e ho bisogno di rimuovere un widget.
Come posso fare questo? Non riesco a trovare metodi utili
Soluzione
Molte cose in Qt non possono essere "tradizionalmente" rimosso. Invece chiamare hide () su di esso e distruggere esso. Da QSplitter documentazione:
Quando si nasconde () un bambino il suo spazio sarà essere distribuiti tra gli altri bambini. Sarà ripristinato quando si mostra () di nuovo.
Altri suggerimenti
Non è chiaro a me se si desidera conservare il widget e metterlo da qualche altra parte, o se si vuole distruggere il widget.
-
Distruggere il widget: Se è possibile ottenere un puntatore al widget, è possibile semplicemente eliminarlo. Lo splitter tranquillamente essere notificato che il suo bambino è di essere eliminati e che elimina da se stessa.
-
Preservare il widget: Se si afferra il puntatore al widget, è possibile è sufficiente impostare il suo genitore per qualche altro Widget e aggiungerlo ad un altro il layout di widget e si riveleranno Là. Questo è sicuro perché il QSplitter verrà informato che uno dei suoi figli viene reparented.
Se si desidera impostare il genitore a NULL (risposta di cjhuitt) essere consapevoli del fatto che si è ora responsabile della pulizia che la memoria perché il widget non ha più un genitore.
Mi piace la risposta di Tuminoid. Ma se è assolutamente necessario che venga rimossa, provare a ottenere il widget che si desidera rimuovere, e chiamando setParent( NULL )
su quel widget. Questa è la mia ipotesi migliore.
Se si tiene un puntatore al widget, poi basta eliminarlo, o utilizzare deleteLater () se si vuole essere sul sicuro.
Se non si dispone il puntatore del widget, utilizzare QSplitter :: widget di (int index) la funzione. Quindi, è possibile utilizzare richiamare slot deleteLater ().
Se non si dispone l'indice widget di, ma è ancora conosce il widget di objectName (), poi QObject :: findChild () è il vostro unico modo per ottenere il puntatore del widget.
Ho incontrato lo stesso problema. In Qt 4.8 per nascondere temporaneamente uno del widget di un QSplitter ho semplicemente nasconderlo. Tuttavia non è sufficiente, come la maniglia splitter è ancora disponibile a muoversi. Ma la maniglia può essere letta e nascosto così:
frameA->setVisible(conditionA);
frameB->setVisible(conditionB);
if ( !(conditionA && conditionB) ) // if only 1 frame is visible
{
splitter->handle(0)->setVisible(false);
}
Un altro modo semplice per evitare che il widget di bambino da essere eliminati è quello di utilizzare QSplitter.takeWidget (bambino). Questo è anche il metodo consigliato di rimuovere il widget da un divisore. (Documentazione Qt)