Domanda

Ho un app Qt che utilizza QPointers per aprire finestre di dialogo nuova interfaccia utente (Widget). L'applicazione principale può avere numerose dello stesso widget di carico di dati diversi. Il problema che sto avendo è in eliminazione e liberare la memoria per ciascun widget. Se a monitorare l'utilizzo della RAM del programma, ogni volta che si fa clic sul pulsante per aprire uno di questi nuovi widget, aumenta la ram e quando chiudo il widget, non sembra essere liberando l'ariete. Ho provato con deleteLater e altre soluzioni, ma continuo a ricevere crash del programma.

Qualche esempio di codice è qui:

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

Questa chiamerà il widget di "ListReservations", che viene dichiarata come QDialog (non modale). Nella finestra di dialogo che ho poi ho un pulsante per chiudere la finestra che si chiama slot QWidget::close().

Credo che la domanda è: come fa il mio programma principale (che ha il QPointer) sapere quando il dialogo viene chiuso e poi liberare la finestra di dialogo e (se possibile) eliminare il puntatore per risparmiare ancora di più memoria ...

Ho pensato che potrebbe essere in grado di fare un QConnect() all'oggetto QPointer, ma io non riesco a trovare alcun segnale o slot che permetterebbero il passaggio del puntatore, tanto meno inviare il segnale di una volta che il dialogo è infatti chiuso e pronto per l'eliminazione.

Forse ho bisogno di un qualche tipo di funzione nel programma principale che prende un oggetto puntatore generico e quindi hanno la chiamata QDialog che prima di chiamare il proprio vicino di slot? In tale funzione passerebbe stesso per essere distrutti? Basta buttare fuori le idee che ho cercato di implementare ma non è riuscito a ....

Non credo che posso riutilizzare lo stesso puntatore altrove perché, in teoria, si potrebbe avere più ListReservations finestre si aprono allo stesso tempo.

È stato utile?

Soluzione

Assicurarsi di aver impostato l'attributo bandierina Qt::WA_DeleteOnClose sul dialogo con QWidget::setAttribute(). Questo dovrebbe fare in modo che la finestra di dialogo è correttamente distrutto quando è chiuso. Vedere la Qt documentazione per ulteriori dettagli.

Supponendo che la memoria è ora correttamente liberato, il puntatore dovrebbe invalidare sé, dal href="http://doc.trolltech.com/4.6/qpointer.html" rel="nofollow noreferrer"> documentazione :

  

Un puntatore custodito, QPointer,   si comporta come un normale C ++ puntatore T *,   tranne che è impostata automaticamente   0 quando l'oggetto si fa riferimento è   distrutte (a differenza normale C ++, puntatori   che diventano "penzoloni puntatori" a   questi casi)

scroll top