Como remover Widgets de QSplitter
Pergunta
Em meu aplicativo tem uma janela dividida por um QSplitter, e eu preciso remover um widget.
Como posso fazer isso? Não consigo encontrar métodos úteis
Solução
Muitas coisas na Qt não pode ser "tradicionalmente" removido. Em vez hide call () nele e destruir-lo. De QSplitter documentação :
Quando você oculta () uma criança a sua vontade espaço ser distribuída entre os outros crianças. Ele será reintegrado quando você mostra () novamente.
Outras dicas
Não está claro para mim se você quiser preservar o widget e colocá-lo em outro lugar, ou se você quer destruir o widget.
-
Destruir o widget: Se você puder obter um ponteiro para o widget, você pode simplesmente excluí-lo. O divisor será seguramente ser notificado de que seu filho é sendo excluído e irá removê-lo de si mesmo.
-
Preservar o widget: Se você grab o ponteiro para o widget, você pode basta definir o seu pai para algum outro widget e adicioná-lo para outro o layout do widget e ele vai aparecer há. Isto é seguro porque o QSplitter será notificado de que um de seus filhos está sendo reparented.
Se você quiser definir o pai de NULL (resposta de cjhuitt) estar ciente de que você está agora responsável pela limpeza que a memória porque o widget já não tem um pai.
Eu gosto de resposta de Tuminoid. Mas se você absolutamente necessário retirá-lo, tente obter o widget que deseja remover, e setParent( NULL )
convidando este widget. Esse é o meu melhor palpite.
Se você segurar um ponteiro para o widget, em seguida, basta apagá-lo ou usar deleteLater () se você quiser estar no lado seguro.
Se você não tem o ponteiro widget, use a função QSplitter :: widget (int index). Então, você pode usar invocação de seu slot deleteLater ().
Se você não tem o índice widget, mas você ainda sabe o widget objectName (), então QObject :: findChild () é a sua única maneira de obter o ponteiro do widget.
Eu corri para o mesmo problema. Em Qt 4.8 para temporalmente esconder um do widget de um QSplitter eu simplesmente escondê-lo. No entanto, não é suficiente, como a alça de divisão ainda está disponível para mover. Mas a alça pode ser acessado e escondido, bem como:
frameA->setVisible(conditionA);
frameB->setVisible(conditionB);
if ( !(conditionA && conditionB) ) // if only 1 frame is visible
{
splitter->handle(0)->setVisible(false);
}
Outra forma fácil de evitar que o widget filho de ficar excluída é usar QSplitter.takeWidget (criança). Esta é também a maneira recomendada de remover o widget de um divisor. (Documentação Qt)