2009-12-18 4 views
7

Uso QCompleter con QLineEdit e voglio aggiornare il modello di QCompleter in modo dinamico. cioè il contenuto del modello viene aggiornato in base al testo di QLineEdit.Come aggiornare dinamicamente il modello di QCompleter

1) mdict.h

#include <QtGui/QWidget> 

class QLineEdit; 
class QCompleter; 
class QModelIndex; 

class mdict : public QWidget 
{ 
    Q_OBJECT 

public: 
    mdict(QWidget *parent = 0); 
    ~mdict() {} 

private slots: 
    void on_textChanged(const QString &text); 

private: 
    QLineEdit *mLineEdit; 
    QCompleter *mCompleter; 
}; 

2) mdict.cpp

#include <cassert> 
#include <QtGui> 
#include "mdict.h" 

mdict::mdict(QWidget *parent) : QWidget(parent), mLineEdit(0), mCompleter(0) 
{ 
    mLineEdit = new QLineEdit(this); 
    QPushButton *button = new QPushButton(this); 
    button->setText("Lookup"); 

    QHBoxLayout *layout = new QHBoxLayout(this); 
    layout->addWidget(mLineEdit); 
    layout->addWidget(button); 
    setLayout(layout); 

    QStringList stringList; 
    stringList << "m0" << "m1" << "m2"; 
    QStringListModel *model = new QStringListModel(stringList); 
    mCompleter = new QCompleter(model, this); 
    mLineEdit->setCompleter(mCompleter); 

    mLineEdit->installEventFilter(this); 

    connect(mLineEdit, SIGNAL(textChanged(const QString&)), 
      this, SLOT(on_textChanged(const QString&))); 
} 

void mdict::on_textChanged(const QString &) 
{ 
    QStringListModel *model = (QStringListModel*)(mCompleter->model()); 
    QStringList stringList; 
    stringList << "h0" << "h1" << "h2"; 
    model->setStringList(stringList); 
} 

mi aspetto quando ingresso "h", dovrebbe darmi un elenco di completamento automatico con "H0" , "h1" e "h2" e potrei usare il keyborad per selezionare l'elemento. Ma non funziona come mi aspettavo.

Sembra che il modello debba essere impostato prima che QLineEdit emetta il segnale "textChanged". Un modo è reimplementare "keyPressEvent", ma implica molte condizioni per ottenere il testo di QLineEdit.

Quindi, voglio sapere c'è un modo semplice per aggiornare il modello di QCompleter in modo dinamico?

+0

ho cercato evento, funziona, ma non è facile da usare perché ci sono tanti tipi di tasti premuti (per esempio Backspace ....). In qlinecontrol.cpp, puoi vedere più dettagli. Voglio solo sapere che potrebbe essere fatto in un modo semplice? –

risposta

4

Oh, ho trovato la risposta:

Usa segnale "textEdited" invece di "TextChanged".

Il debug del codice sorgente di QT mi ha detto la risposta.

+0

Anche questo mi è stato di aiuto, ma ottengo ancora un errore di segmentazione quando cerco di scavare più in profondità in una directory, per favore guarda il codice su [paste bin] (http://pastebin.com/Jxziq8hW) .. –

1

si può usare qualcosa di simile:

Foo:Foo() 
{ 
    ... 
    QLineEdit* le_foodName = new QLineEdit(this); 
    QCompleter* foodNameAutoComplete = new QCompleter(this); 
    le_foodName->setCompleter(foodNameAutoComplete); 

    updateFoodNameAutoCompleteModel(); 
    ... 
} 

// We call this function everytime you need to update completer 
void Foo::updateFoodNameAutoCompleteModel() 
{ 
    QStringListModel *model; 
    model = (QStringListModel*)(foodNameAutoComplete->model()); 
    if(model==NULL) 
     model = new QStringListModel(); 

    // Get Latest Data for your list here 
    QStringList foodList = dataBaseManager->GetLatestFoodNameList() ; 

    model->setStringList(foodList); 
    foodNameAutoComplete->setModel(model); 
} 
0

Usa filterMode : Qt::MatchFlags proprietà. Questa proprietà mostra come viene eseguito il filtraggio. Se filterMode è impostato su Qt::MatchStartsWith, verranno visualizzate solo le voci che iniziano con i caratteri digitati. Qt::MatchContains visualizzerà le voci che contengono i caratteri digitati e Qt::MatchEndsWith quelli che terminano con i caratteri digitati. Attualmente, solo queste tre modalità sono implementate. Impostando filterMode su qualsiasi altro Qt::MatchFlag emetterà un avviso e non verrà eseguita alcuna azione. La modalità predefinita è Qt::MatchStartsWith.

Questa proprietà è stata introdotta in Qt 5.2.

funzioni di accesso:

Qt::MatchFlags filterMode() const 
void setFilterMode(Qt::MatchFlags filterMode)