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.

Foi útil?

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)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top