Pregunta

Tengo una aplicación Qt que utiliza QPointers para que aparezca nueva interfaz de usuario Diálogos (widgets). La aplicación principal puede tener numerosas del mismo artilugio cargado con datos diferentes. El problema que estoy teniendo es en la supresión y liberar la memoria de cada widget. Si puedo monitorear el uso de la RAM del programa, cada vez que haga clic en el botón para abrir uno de estos nuevos widgets, aumenta la memoria RAM y cuando cierro el widget, no parece estar liberando la memoria RAM. He intentado usar deleteLater y otras soluciones, pero seguir recibiendo los accidentes en el programa.

Algunos ejemplos de código está aquí:

QPointer<ListReservations> listResWindow = new ListReservations(resID);
listResWindow->setNum(numpeople);
listResWindow->show();

Para ello, será el widget "ListReservations" que se declara como un QDialog (no modal). En ese cuadro de diálogo que luego tienen un botón para cerrar la ventana que llama a la ranura QWidget::close().

Creo que la pregunta es ¿Por qué mi programa principal (que tiene la QPointer) sabe cuando el diálogo se cierra y luego liberar el diálogo y (si es posible) suprimir el puntero para ahorrar aún más memoria ...

Puede ser capaz de hacer un QConnect() al objeto QPointer, pero me parece que no puede encontrar ninguna señal o ranuras que permitan el paso del puntero, y mucho menos enviar la señal una vez que el diálogo es, en efecto cerrada y listo para su eliminación.

Tal vez necesita algún tipo de función en el programa principal que toma un objeto de puntero genérico y luego tener la llamada QDialog que antes de llamar a su propia ranura estrecha? En esa función que pasaría sí para ser destruido? Simplemente tirar ideas que he tratado de poner en práctica, pero fracasó en ....

No creo que pueda volver a utilizar el mismo puntero en otro lugar porque en teoría se pueden tener varias ListReservations ventanas abiertas al mismo tiempo.

¿Fue útil?

Solución

Asegúrese de que se establece el indicador de atributo Qt::WA_DeleteOnClose en su diálogo utilizando QWidget::setAttribute(). Eso debería asegurarse de que el diálogo se destruye correctamente cuando está cerrado. Vea la Qt documentación para más detalles.

Si se asume que la memoria está ahora liberado correctamente, el puntero debe invalidar sí, desde el href="http://doc.trolltech.com/4.6/qpointer.html" rel="nofollow noreferrer"> documentación :

  

Un puntero vigilado, QPointer,   se comporta como una normal de C ++ puntero T *,   excepto que se ajusta automáticamente a   0 cuando el objeto referenciado es   destruidas (a diferencia de C normal de punteros ++,   que se convierten en "punteros" que cuelgan en   tales casos)

scroll top