Problème en QT avec un completer

Résolu
Kaos -  
 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 :

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:

2 réponses

loupius
 
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'.
0
Kaos
 
Ils le sont bien, j'ai juste voulu éviter de surcharger mon post de code. Voila les constructeurs :

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...
0
loupius
 
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.
0
Kaos > loupius
 
C'est vraiment très gentil de ta part, mais je vais t'épargner ca. Le projet total comporte une trentaine de classe (donc 60 fichiers avec le .h et le .cc).
Je sens que je vais devoir continuer à trimer jusqu'a trouver... Enfin bon, merci quand même l'ami!
0
loupius > Kaos
 
OK. Effectivement c'est un peu trop long!
Mais n'oublie pas que dans plus de 99% des cas, les erreurs de segmentation sont dûes à une mauvaise ou non initialisation d'un pointeur.
Bon courage.
Nota: N'oublie pas non plus de marquer le problème comme résolu (même s'il ne l'est pas;-) )
0
Lam
 
Est ce que tu peux m'envoyer ton projet ?
0