Problème avec QString et QTextEdit

Le problème exposé dans ce sujet a été résolu.

Bonjour, je souhaite faire un programme qui affiche generations->value() nombre aléatoire entre 0 et 36. Et j'aimerai que tous les nombres générés soient dans un QString que j'afficherai dans un QTextEdit

Cependant, mon code des erreurs au niveau de la ligne 54 et 56 que je ne comprends pas Image utilisateur Pouvez-vous m'aider ?

N'utilise pas de pointeur nu sur autre chose qu'un QObject et sans une bonne raison. C'est inutile, ici.

RomHa Korev

Pour être plus précis, les objets héritant de QObject sont généralement déclaré comme pointeurs, car Qt fonctionne avec un système de hiérarchie (objets parents/enfants). Cela a notamment l'avantage suivant : lors de la destruction d'un objet, ce dernier va automatiquement détruire tous ses objets enfants, sans que l'utilisateur n'ait besoin de soucier de quelque problème lié à la mémoire.

Dans ton cas, QString est simplement une implémentation de chaîne de caractère fournit par Qt. Elle s'utilise donc de la même manière que std::string. Avoir un pointeur de QString n'a donc pas de sens et ne fera que compliquer les choses.

+1 -0

HS : ne fais pas de copie d'écran, copie-colle ton code directement (avec le bouton Code <>)

HS2 : ne prédéclare pas tes variables pour rien

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// non
int nombre (0);
for (...) {
    nombre = ...
}

// oui
for (...) {
    const int nombre = ...
}

HS3 : j'imagine que ce n'est pas une erreur, mais ton "for" est étrange. En C++, habituellement, on ne compte pas de 1 à "<= value", mais de 0 à "< value" (similitude avec les index dans les tableaux).

HS4 : n'utilises pas les parenthèses pour initialiser une variable (risque de confusion). Préfères les accolades (cf les variables):

1
2
int i {};       // initialisation avec 0
int j { 123 };  // initialisation avec une valeur

Pour être plus précis, les objets héritant de QObject sont généralement déclaré comme pointeurs, car Qt fonctionne avec un système de hiérarchie (objets parents/enfants). Cela a notamment l'avantage suivant : lors de la destruction d'un objet, ce dernier va automatiquement détruire tous ses objets enfants, sans que l'utilisateur n'ait besoin de soucier de quelque problème lié à la mémoire.

L'explication n'est pas fausse, mais peut porter à confusion.

Pour être précis : les QObject ont une sémantique d'entité, ce qui implique qu'ils ne sont pas copiables et être polymorphiques. Cela implique qu'on les manipules souvent par pointeurs. Et comme la gestion manuelle de la mémoire en C++ avec pointeur peut être chiante, Qt utilise un système de parent-enfants pour détruire automatiquement les QObject.

Pour les classes non-QObject, qui sont copiable et non-polymorphique, l'utilisation de pointeurs ne sert pas à grand chose.

+0 -0

Pour être plus précis, les objets héritant de QObject sont généralement déclaré comme pointeurs, car Qt fonctionne avec un système de hiérarchie (objets parents/enfants). Cela a notamment l'avantage suivant : lors de la destruction d'un objet, ce dernier va automatiquement détruire tous ses objets enfants, sans que l'utilisateur n'ait besoin de soucier de quelque problème lié à la mémoire.

L'explication n'est pas fausse, mais peut porter à confusion.

Pour être précis : les QObject ont une sémantique d'entité, ce qui implique qu'ils ne sont pas copiables et être polymorphiques. Cela implique qu'on les manipules souvent par pointeurs. Et comme la gestion manuelle de la mémoire en C++ avec pointeur peut être chiante, Qt utilise un système de parent-enfants pour détruire automatiquement les QObject.

Pour les classes non-QObject, qui sont copiable et non-polymorphique, l'utilisation de pointeurs ne sert pas à grand chose.

gbdivers

Je dois comprendre par là que, pour un simple programme avec quelques widgets où le polymorphisme n'entre pas en jeu, ceux-ci n'ont pas besoin d'être manipulés par des pointeurs ? Cela n'aurait aucune différence ?

(A vrai dire, je ne m'étais jamais vraiment posé la question, puisque tous les tutos utilisaient des pointeurs, et qu'apparemment c'était nécessaire au système de hiérarchie de Qt.)

Je dois comprendre par là que, pour un simple programme avec quelques widgets où le polymorphisme n'entre pas en jeu, ceux-ci n'ont pas besoin d'être manipulés par des pointeurs ? Cela n'aurait aucune différence ?

Olybri

C'est parce que tu n'as pas réalisé un point. Les tutos de base propose généralement le code suivant pour main :

1
2
3
4
5
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    ...
    return app.exec();
}

Or, QApplication est bien un QObject ;) Donc pas de problème pour utiliser sans pointeurs.

Par contre, dès qu'un QObject est membre d'une classe QObject, avec le système parent-enfants, il faut un pointeur, pour éviter le double delete. Donc on se retrouve très vite à manipuler tous les QObject par pointeur. Mais ce n'est pas une obligation.

1
2
3
4
class A : public QObject {
   QObject o;       // double delete
   A() : o(this) {}
};
+1 -0

Par contre, dès qu'un QObject est membre d'une classe QObject, avec le système parent-enfants, il faut un pointeur, pour éviter le double delete. Donc on se retrouve très vite à manipuler tous les QObject par pointeur. Mais ce n'est pas une obligation.

gbdivers

Ah ok, c'est donc ça la "vrai raison". Merci pour les précisions. :)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte