Problème en QT avec un completer
Résolu
Kaos
-
Lam -
Lam -
Bien le bonjour, amis programmeurs!
Me voila encore devant vous car je fais face à un problème insoluble pour mon petit cerveau...
Voila un peu les faits : je participe à un projet ayant pour but la création d'un éditeur web en Qt. Bon, jusque là on a pas trop de problème, mais je suis chargé de développer l'auto-complétion. Là encore, j'ai choppé le code d'exemple de Qt et l'ai adapté au mieux au projet.
Ce code adapté possède une classe "completer" qui hérite de QCompleter et qui initialise tout ce qu'il faut, et une classe "editeur" qui hérite de QTextEdit et qui donc est le champs de texte à qui l'on attache le completer.
Bon, en fait dans la classe "editeur" je dois utiliser la méthode "textCursor()" qui me retourne le texte à partir de l'emplacement du curseur. Lors de mes tests, avant d'adapter mon code, l'appel de cette fonction ne posait pas de problème. Mais maintenant, l'application compile bien, elle se lance, mais dès que j'y fait appel, ça fait comme une erreur de segmentation (sous windows, la fenetre de recherche de résolution de problème apparait)
Voila le code concerné (en partie) :
Dans le editeur.h :
Dans le "editeur.cc" :
Dans "completer.h" :
Et enfin, le "completer.h" :
Donc voila, le programme bug dès que j'appuie sur une touche et qu'il arrive au moment d'appeler "textCursor" dans le "getTextCursor()" . Seul le premier cout est affiché.
Me voila encore devant vous car je fais face à un problème insoluble pour mon petit cerveau...
Voila un peu les faits : je participe à un projet ayant pour but la création d'un éditeur web en Qt. Bon, jusque là on a pas trop de problème, mais je suis chargé de développer l'auto-complétion. Là encore, j'ai choppé le code d'exemple de Qt et l'ai adapté au mieux au projet.
Ce code adapté possède une classe "completer" qui hérite de QCompleter et qui initialise tout ce qu'il faut, et une classe "editeur" qui hérite de QTextEdit et qui donc est le champs de texte à qui l'on attache le completer.
Bon, en fait dans la classe "editeur" je dois utiliser la méthode "textCursor()" qui me retourne le texte à partir de l'emplacement du curseur. Lors de mes tests, avant d'adapter mon code, l'appel de cette fonction ne posait pas de problème. Mais maintenant, l'application compile bien, elle se lance, mais dès que j'y fait appel, ça fait comme une erreur de segmentation (sous windows, la fenetre de recherche de résolution de problème apparait)
Voila le code concerné (en partie) :
Dans le editeur.h :
class Editeur : public QTextEdit { Q_OBJECT private: Completer * completer; protected : void keyPressEvent(QKeyEvent*); public: QTextCursor getTextCursor() const; };
Dans le "editeur.cc" :
//////////////////////////////////Le problème est ici QTextCursor Editeur::getTextCursor() const { cout<<"on entre dans le getTC"<<endl; if(textCursor().isNull())//////////////////////////////Le programme plante ici { cout<<"pointeur vide"<<endl; return QTextCursor(); } else { cout<<"pointeur plein"<<endl; return textCursor(); } } void Editeur::keyPressEvent(QKeyEvent* evenement) { completer->activeComplete(evenement); }
Dans "completer.h" :
class Editeur; class Completer : public QCompleter//donc tu hérite de QCompleter donc this est un QCompleter { Q_OBJECT private: Editeur * parent; public: Completer(Editeur* parent); void activeComplete(QKeyEvent *e); QString textUnderCursor() const; };
Et enfin, le "completer.h" :
QString Completer::textUnderCursor() const { QTextCursor tc = parent->getTextCursor(); tc.select(QTextCursor::WordUnderCursor); return tc.selectedText(); } void Completer::activeComplete(QKeyEvent *e) { . . . QString completionPrefix = textUnderCursor(); . . . . }
Donc voila, le programme bug dès que j'appuie sur une touche et qu'il arrive au moment d'appeler "textCursor" dans le "getTextCursor()" . Seul le premier cout est affiché.
A voir également:
- Problème en QT avec un completer
- Telechargement film d'action complet en francais - Télécharger - TV & Vidéo
- Qt sdk - Télécharger - Langages
- Fais glisser le curseur pour compléter le puzzle - Guide
- Telecharger film titanic complet en français avec utorrent - Forum Musique / Radio / Clip
- Coran complet en français pdf - Télécharger - Histoire & Religion
2 réponses
Puisque t'en parles, sinon je n'aurais pas osé... achète un cerveau plus grand ;-)
Il n'est pas évident que le programme plante ici (là où tu le dis); parfois les problèmes de segmentation sont bizarres; un code mal écrit qui fonctionne bien jusqu'à ce qu'on rajoute une ligne qui n'a rien à voir et bing ça plante.
Il faut que tu vérifies si tous tes pointeurs sont bien alloués: par exemple dans le constructeur de la classe 'Editeur', trouve-t-on bien un completer = new Completer; car je trouve bizarre qu'il n'y ait pas de constructeur. De même pour 'parent' dans la classe 'Completer'.
Il n'est pas évident que le programme plante ici (là où tu le dis); parfois les problèmes de segmentation sont bizarres; un code mal écrit qui fonctionne bien jusqu'à ce qu'on rajoute une ligne qui n'a rien à voir et bing ça plante.
Il faut que tu vérifies si tous tes pointeurs sont bien alloués: par exemple dans le constructeur de la classe 'Editeur', trouve-t-on bien un completer = new Completer; car je trouve bizarre qu'il n'y ait pas de constructeur. De même pour 'parent' dans la classe 'Completer'.
Ils le sont bien, j'ai juste voulu éviter de surcharger mon post de code. Voila les constructeurs :
Je me doute que le problème ne vient pas forcément de l'endroit marqué, mais c'est forcément en relation. J'ai beau revérifier, je ne vois vraiment pas ou j'ai commis une erreur...
Editeur::Editeur(QWidget* parent, int t1, int t2) : QTextEdit(parent), tempsAttenteSouris (t1), tempsAttenteClavier(t2) { completer = new Completer(this); } Completer::Completer(Editeur* parent) : QCompleter() { chemin_variables = QString("C:\\Users\\William\\Desktop\\Beta\\EditeurWebZip\\fichiers\\variables.txt"); this->setModel(modelFromFile()); this->setModelSorting(QCompleter::CaseInsensitivelySortedModel); this->setCaseSensitivity(Qt::CaseInsensitive); this->setWrapAround(false); this->setWidget(parent); this->setCompletionMode(QCompleter::PopupCompletion); this->setCaseSensitivity(Qt::CaseInsensitive); QObject::connect(this, SIGNAL(activated(const QString&)),this, SLOT(insertCompletion(const QString&))); fichier_variables_temporaires = new QFile(chemin_variables); if(!fichier_variables_temporaires->exists()) { cout<<"Erreur lors de la création du fichier"; } }
Je me doute que le problème ne vient pas forcément de l'endroit marqué, mais c'est forcément en relation. J'ai beau revérifier, je ne vois vraiment pas ou j'ai commis une erreur...
Dans le code donné, je ne vois pas d'erreur.
Je suppose que le code est trop long pour être mis sur ce site. si le code n'est pas confidentiel et si tu connais le moyen de transmettre la totalité du projet via un autre site (il y en a qui le font mais moi je ne suis pas affuté sur ce genre de sport (en clair, je ne sais pas comment il faut procéder)), je veux bien regarder.
A suivre.
Je suppose que le code est trop long pour être mis sur ce site. si le code n'est pas confidentiel et si tu connais le moyen de transmettre la totalité du projet via un autre site (il y en a qui le font mais moi je ne suis pas affuté sur ce genre de sport (en clair, je ne sais pas comment il faut procéder)), je veux bien regarder.
A suivre.