Qpointer e excluindo objetos
Pergunta
Eu tenho um aplicativo QT que usa QPointers para exibir novas caixas de diálogo da interface do usuário (widgets). O aplicativo principal pode ter vários widgets carregados com dados diferentes. O problema que estou tendo é excluir e liberar a memória para cada widget. Se eu monitorar o uso da RAM do programa, cada vez que clico no botão para abrir um desses novos widgets, ele aumenta a RAM e, quando fecho o widget, ele não parece estar liberando a RAM. Eu tentei usar deleteLater
e outras soluções, mas continue sofrendo falhas no programa.
Algum código de exemplo está aqui:
QPointer<ListReservations> listResWindow = new ListReservations(resID);
listResWindow->setNum(numpeople);
listResWindow->show();
Isso chamará o widget "ListServations", que é declarado como um QDialog
(Não modal). Nesse diálogo, tenho um botão para fechar a janela que chama o QWidget::close()
slot.
Eu acho que a pergunta é como meu programa principal (que tem o QPointer
) Saiba quando a caixa de diálogo é fechada e depois liberte a caixa de diálogo e (se possível) exclua o ponteiro para salvar ainda mais memória ...
Eu pensei que você poderia fazer um QConnect()
para o QPointer
Objeto, mas não consigo encontrar sinais ou slots que permitiriam a passagem do ponteiro, muito menos enviar o sinal quando a caixa de diálogo estiver realmente fechada e pronta para exclusão.
Talvez eu precise de algum tipo de função no programa principal que pegue um objeto de ponteiro genérico e, em seguida, faça com que o qdialog chamasse isso antes de chamar seu próprio slot próximo? Nessa função, passaria a ser destruído? Apenas jogando idéias que eu tentei implementar, mas falhei ....
Eu não acho que posso reutilizar o mesmo ponteiro em outro lugar, porque, em teoria, você pode ter várias janelas de listreservations abertas ao mesmo tempo.
Solução
Certifique -se de definir o Qt::WA_DeleteOnClose
atributo sinalizador em sua caixa de diálogo usando QWidget::setAttribute()
. Isso deve garantir que a caixa de diálogo seja devidamente destruída quando está fechada. Veja o Documentação QT para mais detalhes.
Supondo que a memória agora seja adequadamente libertada, o ponteiro deve se invalidar, do Documentação QT:
Um ponteiro guardado, QPointer, se comporta como um ponteiro C ++ normal t *, exceto que ele é automaticamente definido como 0 quando o objeto referenciado é destruído (diferentemente dos ponteiros normais de C ++, que se tornam "ponteiros pendurados" nesses casos)