QCompleter : setCompletionPrefix ?

a marqué ce sujet comme résolu.

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

+0 -0

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 ?

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 :(

+0 -0

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().

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 ? :'(

+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.

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 ^^

+0 -0
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