2015-01-22 10 views
5
Codice

Esempio:È necessario eliminare QValidator manualmente?

QDoubleValidator *validator = new QDoubleValidator(); 
myInputLineEdit->setValidator(validator); 

// delete validator; 

Nota: myInputLineEdit è un puntatore QLineEdit e sarà eliminato con il suo genitore.

La mia domanda è, quando devo eliminare il validatore, poiché è stato creato manualmente e setValidator() non sembra assumere la proprietà di questo puntatore in base alla documentazione? Se non lo elimini, sarà una perdita di memoria?

Ho provato a eliminarlo subito dopo, come il codice commentato, e ho notato che il validatore di myInputLineEdit è diventato 0 dopo. Quindi penso che potrebbe essere necessario cancellarlo dopo che myInputLineEdit è stato eliminato.

Un altro pensiero è, potrei dare un genitore di validatore in modo che venga cancellato insieme al suo parrent, è un buon modo per farlo? E se non ci fosse un buon candidato come genitore?

Grazie

+1

Se sei interessato al motivo per cui 'setValidator' non ne diventa proprietario: è probabilmente perché puoi usare lo stesso validatore per più widget di input, quindi è un po 'di proprietà * condivisa *.Ma QObjects non ha una proprietà condivisa, ma invece * unique * parent-ownership, quindi è necessario impostare il genitore su * some * widget (o la modifica della riga o un genitore di essa, qualsiasi cosa abbia più senso). – leemes

risposta

6

ho cercato di eliminarlo subito dopo, come il codice commentato, e ho notato il validatore di myInputLineEdit divenne 0 dopo. Quindi io penso di aver bisogno di cancellarlo dopo che myInputLineEdit è stato cancellato.

È perché QLineEdit usa QPointer internamente, che tiene traccia QValidator oggetto se è stato eliminato.

e setValidator() non sembra prendere la proprietà di questo puntatore in base alla documentazione

setValidator() infatti non imposta madre di QValidator.

Un altro pensiero è, ho potuto dare validatore un genitore così sarà cancellato insieme con la sua parrent, questo è un buon modo per farlo? Cosa succede se non c'è un buon candidato come genitore?

È possibile eliminare manualmente, utilizzare i puntatori intelligenti o fare come @crayzeewulf detto - set myInputLineEdit come genitore (utilizzando QValidator costruttore o setParent()). Il genitore si occupa di eliminare i suoi figli, quindi è un modo per andare. Di solito oggetto a cui è assegnato il validatore è un buon genitore.

Se non lo elimino, sarà una perdita di memoria?

Se non si imposta un genitore né si elimina, si verificherà una perdita di memoria.

+0

Grazie ragazzi. Non ho usato myInputLineEdit come genitore perché voglio usare questo validatore per diversi oggetti QLineEdit, come menzionato da @leemes. Quindi ci sarà un problema quando uno di loro viene cancellato. Immagino di avere due scelte qui: 1, creare un validatore per ogni QLineEdit; 2, poiché tutti questi oggetti di QLineEdit sono membri di una classe comune, che è anche una classe QObject, posso usarla come genitore. – vlursk

+0

@Leo Go con l'opzione 2. – thuga

2

Utilizzare mInputLineEdit come parent di validator come nell'esempio here. Il distruttore di un genitore distrugge tutti gli oggetti figli (vedi this). Questo è il "modo qt" di gestire ownership trees.

Problemi correlati