2010-08-17 7 views
2

J'ai quelques précisions concernant la programmation Qt. Dans Qt la plupart du temps, nous instancions un widget en allouant dynamiquement la mémoire.dans Qt nous utilise plus de pointeurs, y at-il des avantages?

Y a-t-il des avantages à faire ça de Qt prospective? et qu'en est-il de la désallocation de la mémoire pour le widget? avons-nous besoin d'appeler manuellement la suppression pour la mémoire allouée ou les poignées Qt?

Exemple

QListView *newlist = new QListView(); //This is good? if so why? 
QListView newlist; // why not this? 

Répondre

3

Voir mes my reply sur QObjects. En bref: On crée des widgets sur le tas, car ils doivent généralement survivre à la méthode actuelle, et ils ne peuvent être ni assignés ni copiés. QWidgets supprime leurs enfants lorsqu'ils sont eux-mêmes supprimés (ou plus généralement, QObjects supprime leurs enfants), donc il n'y a généralement pas de problème de gestion de la mémoire si vous passez un parent au widget.

+0

@frank, Merci pour la réponse. une chose que je ne reçois pas dans votre description est "ils ne peuvent pas être assignés ni copiés" Qu'est-ce que ça dit exactement, ne pouvons-nous attribuer des valeurs, ne pouvons-nous les copier en utilisant des constructeurs de copie? – Naruto

+0

@Shadow: Ni la copie ctor ni l'opérateur = sont privés pour QObjects. C'est pourquoi ils sont passés en tant que pointeurs. Les QObjects ne sont pas des valeurs, ils ont une "identité". Même si vous implémentez par ex. operator = pour une sous-classe, assigner un QObject à un autre casse la sémantique. Par exemple, les connexions signal/emplacement ne sont pas copiées. –

+0

@Frabk, j'ai analysé http://doc.trolltech.com/4.5/shared.html#overview ici attentivement, j'ai trouvé un doute de plus. QPixmap p1, p2; p1.load ("image.bmp"); p2 = p1; // p1 et p2 partagent des données ici p2 et p1 sont partagés à partir de la prospective Qt mais pas du droit prospectif du programmeur. en général, l'attribution d'un objet à un autre conduit à la copie en profondeur à droite? mais Qt dit que ce sera une copie superficielle .. et si je change la valeur de p2 ici? – Naruto

3

On dirait qu'il est sûr de faire l'allocation de la pile. Voir this answer. Dans le cas de Symbian, cela pourrait différer, cependant. This question apporte quelques bons points.

Je pense qu'avec Symbian, vous avez un espace de pile limité, et beaucoup d'objets eux-mêmes utilisent le partage de données qui est alloué sur le tas de toute façon. À cet égard, il pourrait être une bonne idée de continuer à le faire de façon dynamique.

+0

c'est sûr, mais ce n'est généralement pas ce que vous voulez. Le widget sera détruit immédiatement en quittant le bloc. Les exceptions sont QDialogs avec exec() (qui bloque). –

3
QListView* newlist = new QListView(); //This is good? if so why? 

Seulement si vous stockez le pointeur newlist quelque part et le supprimer manuellement plus tard.

Si possible, je suggère de vous attribuer des widgets sur la pile. Ce n'est pas possible, cependant, en utilisant la technique que je suis sur le point d'expliquer. Lorsque vous concevez des widgets complexes, vous créez normalement un object tree de widgets. Cela signifie que chaque widget, à l'exception du widget racine, a un parent. Lorsqu'un parent est supprimé, il supprimera automatiquement tous ses enfants. Cette méthode est très pratique car vous n'aurez besoin que de suivre le widget racine.

Dans votre cas, vous feriez quelque chose comme ceci:

QListView* newlist = new QListView(parentWidget);