QCompleter : setCompletionPrefix ?

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Je suis en train de développer mon propre client IRC, et j'aimerais qu'il puisse proposer à l'utilisateur une autocomplétion des pseudos du canal courant. Pour ce faire, j'utilise un QCompleter rattaché à mon QLineEdit.

Le truc, c'est que j'aimerais que l'autocomplétion ne fonctionne pas seulement lorsque le pseudo se situe au début, mais n'importe où, ce que je n'arrive pas à faire.

Voici mon code actuel :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
void CanalWidget::on_messageType_textChanged(const QString &content)
{
    if(content != "")
    {
        QString lastWord = content.split(" ")[content.split(" ").count()-1];
        QStringList names;
        for(int i=0;i<ui->listUsers->count();i++)
            names << ui->listUsers->item(i)->text();

        QCompleter *completer = new QCompleter(names);
        ui->messageType->setCompleter(completer);
        completer->setCaseSensitivity(Qt::CaseInsensitive);
        completer->setCompletionPrefix(lastWord);
        completer->setCompletionMode(QCompleter::InlineCompletion);
    }
}

La ligne en jaune aurait dû permettre l'autocomplétion d'un mot qui ne se situerait pas au début du QLineEdit, mais il ne semble pas avoir d'effet… :(

Je suppose que je m'y prends mal ?

Merci d'avance

A graphical interface is like a joke: if you have to explain it, that's shit. | Les logiciels Deuchnord

+0 -0
Staff

La ligne en jaune aurait dû permettre l'autocomplétion d'un mot qui ne se situerait pas au début du QLineEdit, mais il ne semble pas avoir d'effet… :(

C'est à dire ? il se passe quoi ?

Déjà, est ce que lastWord contient le bon contenu ?

+1 -0
Auteur du sujet

La ligne en jaune aurait dû permettre l'autocomplétion d'un mot qui ne se situerait pas au début du QLineEdit, mais il ne semble pas avoir d'effet… :(

C'est à dire ? il se passe quoi ?

Kje

C'est à dire qu'un pseudonyme ne m'est proposé en autocomplétion que si le QLineEdit est entièrement vide.
Cela ne me satisfait pas, puisque je souhaite également que le pseudo soit proposé quand le début d'un pseudonyme est écrit en fin du texte du QLineEdit. Un petit exemple devrait mieux te faire comprendre le problème. Sur les deux captures ci-dessous, un membre du canal où je me trouve porte le pseudonyme Saucisson :

OK : le pseudonyme « Saucisson » est proposé

KO : le pseudonyme « Saucisson » aurait dû être proposé, mais ce n'est pas le cas.

Déjà, est ce que lastWord contient le bon contenu ?

Kje

J'ai effectivement exploré cette voie, sans succès : j'ai ajouté un simple QMessageBox pour vérifier le contenu de lastWord, qui contient effectivement le dernier mot tapé. C'est pourquoi je ne comprends pas pourquoi l'autocomplétion ne fonctionne pas :(

A graphical interface is like a joke: if you have to explain it, that's shit. | Les logiciels Deuchnord

+0 -0
Staff

Dans ton exemple graphique il ne semble pas y avoir d'espace, donc lastWord contient le bonjour, non ?

Pour le reste je ne sais pas trop, je n'ai jamais utilisé ce module. La doc n'est pas très clair sur le but réel du prefix

+1 -0

Cette réponse a aidé l'auteur du sujet

non, setCompletionPrefix() sert à dire à QCompleter "affiche moi tous les mots que tu contiens qui commencent pas XXX. Dans l'exemple, ils redéfinissent QWidget::keyPressEvent, trouvent la position du curseur, récupère les quelques lettres avant et passent ceci à setCompletionPrefix().

+0 -0
Auteur du sujet

Je reviens ici, car j'ai de nouveau un problème… :-°

J'ai commencé à réimplémenter QLineEdit::keyPressEvent() de cette façon (à des fins de test tout d'abord) :

1
2
3
4
5
6
void QLineEdit::keyPressEvent(QKeyEvent *e)
{
    QString lastWord = text().split(" ")[text().split(" ").count()-1];
    completer()->setCompletionPrefix(lastWord);
    std::cout << std::string("prefix : ") + completer()->completionPrefix().toStdString() + std::string(" ; lastWord : ") + lastWord.toStdString() << endl;
}

Résultat : rien ne se produit… En fait, le morceau de code n'est même pas exécuté…
Cela a été confirmé avec une exécution en mode Debug avec un point d'arrêt sur la ligne 3…

Pourtant, la doc de QLineEdit m'indique que cette méthode existe bien…

Quelle boulette ai-je commise ? :'(

A graphical interface is like a joke: if you have to explain it, that's shit. | Les logiciels Deuchnord

+0 -0

il faut aussi envoyer l'event au parent ainsi que demander l'affichage de la liste. un cas super basique qui marche à moitié, c'est ça :

1
2
3
4
5
6
7
8
QString lastWord = text().split(" ")[text().split(" ").count()-1];
completer()->setCompletionPrefix(lastWord);
std::cout << std::string("prefix : ") + completer()->completionPrefix().toStdString() + std::string(" ; lastWord : ") + lastWord.toStdString() << std::endl;
// s'il y a un lastWord et que le completer contient des mots qui commencent par ce préfixe, alors on l'affiche
if(lastWord.trimmed().length() > 0 && completer()->completionCount())
{
    completer()->complete();
}

ça ne marche qu'à moitié, car je ne gère pas les touches envoyés par le completer, comme l'appuie sur la touche entrée pour valider son choix.

+0 -0

Salut,

Si je comprends bien, tu as dérivé QLineEdit pour pouvoir ré-implémenter

1
void QLineEdit::keyPressEvent(QKeyEvent *e)

Si tel est le cas le problème (slot jamais appelé) ne viendrait-il pas du fait que dans le code que tu nous à présenté tu implémente

1
void QLineEdit::keyPressEvent(QKeyEvent *e)

et non

1
void TA_CLASSE_HERITE::keyPressEvent(QKeyEvent *e)

Je dis ça, je suis peut être carrément à côté de la plaque ^^

Fort en pomme ? | AuxiSuite

+0 -0
Auteur du sujet

Salut, Ipodao,

Ce n'est sûrement pas comme ça que l'on fait habituellement, mais en fait je n'ai pas dérivé la classe QLineEdit, je n'ai fait que réimplémenter la méthode keyPressEvent() qui s'y trouvait déjà…

Est-ce que ça se fait d'ailleurs ? :-°

A graphical interface is like a joke: if you have to explain it, that's shit. | Les logiciels Deuchnord

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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