Domanda

In Qt sto cercando di configurare il mio QWidget, quindi tutto dovrebbe funzionare bene a causa della gestione della memoria e di altre cose.Ma io non riesco a fare con i puntatori, heap e stack.Ho il mio widget MyWidget che hanno un QList con alcuni oggetti.Io non riesco a capire come impostare il tutto per bene.

Potete vedere il mio codice qui sotto ed ho alcune domande per quanto riguarda questo:

  1. L'istanza di un elenco di variabili è creato nel mucchio, sarebbe meglio creare sulla pila?

  2. Nella mia lista ho puntatori, sarebbe meglio creare l'oggetto in pila e aggiungerlo alla lista?(In modo che io non sono puntatori in elenco)

  3. Quando ho aggiungere oggetti alla lista che ottiene la lista, così come il loro genitore automaticamente?Così, quando mi cancella la lista di tutti gli oggetti all'interno dell'elenco verranno eliminati?

  4. Per ogni ciclo sto cercando di usare non funziona, ho avuto "un puntatore/tipo di matrice è stato previsto per questa operazione, invece di 'int'"

  5. Nel mio codice ho voglia di creare altri widget che prende l'oggetto dall'elenco di parametri.È il modo giusto per farlo, come ho?MyOtherWidget istanza metodo simile a questo:MyOtherWidget(MyObject *myObject, QWidget *genitore)

Grazie per il vostro aiuto!Sono nuovo di Qt e C++, quindi sarebbe bello se si potesse mi guida nella giusta direzione.Come posso impostare nella maniera giusta, per rendere più facile, non avere perdite di memoria e utilizzare meno memoria necessaria.Come si imposta la stessa cosa?

Questo è il mio codice:

MyWidget.h:

class MyWidget : public QWidget
{
Q_OBJECT

public:
    MyWidget(QWidget *parent = 0);
    ~MyWidget();

private:
    QList<MyObject*> *list;
};

MyWidget.cpp:

MyWidget::MyWidget(QWidget *parent)
{
    ui.setupUi(this);

    list = new QList<MyObject*>();
    for (int i = 0; i<10; i++) 
    {
        MyObject *myObject = new MyObject("Hello",this);
        list->append(myObject);
    }

    foreach(MyObject *myObject, list)
    {
        //Lets say I want to create other widgets here and that they takes a MyObject as a parameter
        MyOtherWidget *myOtherWidget = new MyOtherWidget(myObject,this);
    }

}

MyWidget::~MyWidget(){
    delete list;
}
È stato utile?

Soluzione

Ad.1.La durata della lista dovrebbe essere lo stesso come la durata del MyWidget istanza, quindi si può tranquillamente creare l'elenco sullo stack.

Ad.2.Si potrebbe fare, ma MyObject classe deve avere un costruttore di default, un costruttore di copia, e un operatore di assegnazione (vedi http://doc.trolltech.com/4.6/containers.html#container-classes per i dettagli).

Ad.3.La proprietà di un oggetto non viene trasferito su append.Proprio come contenitori STL, Qt contenitori non chiamare delete memorizzati i puntatori.Per eliminare tutti i puntatori memorizzati in QList (o altri Qt contenitore) qDeleteAll(elenco).Mente, che probabilmente non si vuole fare in modo che nel codice che hai postato:si passa MyWidget puntatore MyObject costruttore e presumo quindi è utilizzato come QObject genitore.Così tutti QObjects verranno eliminati quando MyWidget viene eliminato.

Ad.4.Il secondo argomento di foreach macro dovrebbe essere un contenitore, non il puntatore del contenitore.Così si dovrebbe chiamare foreach(MyObject *obj, *lista) se il tuo elenco di variabile è un puntatore a QList.

Ad.5.Si dovrebbe essere bene come MyOtherWidget non cancella il passato MyObject (perché il MyWidget è già un genitore di MyObject e si concluderebbe l'eliminazione di uno stesso oggetto due volte).

È una grossolana semplificazione, ma si dovrebbe cercare di scrivere il codice in modo tale che non sia necessario chiamare eliminare.Creare roba sullo stack o si basano su Qt genitore-figli meccanismo (cioèi genitori eliminare i loro figli).In seguito è possibile leggere sulle smart pointers (QSharedPointer, QScopedPointer, etc.).

EDIT:

Se il padre di MyObject o non dipende da quello che stai facendo in MyObject costruttore.Se si passa argomento principale di QObject costruttore, cioèil Myobject costruttore di simile a questo:

MyObject(const QString &text, QObject *parent = 0) : QObject(parent)
{
// more code...
}

il genitore sarà impostato, perché sarà fatto in QObject costruttore, che sarà chiamato a causa delle ":QObject(genitore)" cod.Che cosa succede se non si dispone di questo frammento?Dal momento che il MyObject eredita QObject, e non si specifica che il costruttore dovrebbe essere il valore di default QObject costruttore, cioèQObject(QObject *parent = 0) sarà chiamato, in modo che il padre di tuo MyObject sarà nulla e che non venga eliminato.

Mi piacerebbe provare a evitare l'impostazione di genitore in modo esplicito attraverso setParent metodo - base casi d'uso impostazione di un genitore di un costruttore, dovrebbe essere sufficiente.

Provare a utilizzare la terminologia corretta (non "metodo di istanza", ma "costruttore"), leggere Qt documentazione, usare il buon senso e cercare di non pensare che nulla sarà fatto automaticamente.Il genitore non è impostato "automaticamente" solo perché si chiama un argomento "padre" - è impostato, perché c'è un pezzo di codice che fa in QObject costruttore ed è vostra responsabilità di chiamare pass padre corretta per QObject costruttore in classi che ereditano QObject.

Altri suggerimenti

Sì, il problema è che stai eliminando l'elenco dell'oggetto, ma non i suoi elementi !

Vi suggerisco di dare un'occhiata a :

QList<Employee *> list;
list.append(new Employee("Blackpool", "Stephen"));
list.append(new Employee("Twist", "Oliver"));

qDeleteAll(list.begin(), list.end());
list.clear();

Più info qui

Vorrei anche chiedere se si ha realmente bisogno di un puntatore alla lista ?Si potrebbe semplicemente avere un semplice :

QList<MyObject*> list;

Quindi si hanno meno possibile perdita di memoria !

Spero che questo aiuta un po'!

Edit :
3.Il MyObject oggetti "questo" come genitori.L'elenco non prendere gli oggetti di proprietà quando hai a che fare con i puntatori.
4.Per il ciclo, forse si dovrebbe prendere in considerazione Iteratori, date un'occhiata qui qthelp://com.trolltech.qt.460/qdoc/qlist.html.

Non hai bisogno di memorizzare il bambino widget all'interno di una lista, come lungo come si fanno i loro genitori dell'attuale widget.(Di solito si crea il tuo widget sullo stack con nuovo).

Qt è un auto-funzione di pulizia, il che significa che, se un widget viene rimosso tutti i bambini widget (widget, il cui padre è il widget che viene rimosso) ottenere rimosso.

Quindi l'unica cosa che si dovrà fare in modo (soprattutto per la temporanea popup widget) per cancellare/rimuovere il Widget "popup" o comunque si chiami il popup widget.

Ecco, questo è tutto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top