2009-12-18 27 views
7

Uso QCompleter con QLineEdit y deseo actualizar el modelo de QCompleter de forma dinámica. es decir, los contenidos del modelo se actualizan de acuerdo con el texto de QLineEdit.Cómo actualizar el modelo de QCompleter dinámicamente

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); 
} 

espero que cuando la entrada "h", que debería darme una lista de autocompletar con "H0" , "h1" y "h2" y podría usar keyborad para seleccionar el elemento. Pero no funciona como esperaba.

Parece que el modelo debe establecerse antes de que QLineEdit emita la señal "textChanged". Una forma es volver a implementar "keyPressEvent", pero implica muchas condiciones para obtener el texto de QLineEdit.

Entonces, quiero saber ¿hay alguna manera fácil de actualizar el modelo de QCompleter de forma dinámica?

+0

me han tratado caso, funciona, pero no es fácil de usar ya que hay tantos tipos de pulsaciones de teclas (por ejemplo Retroceso ....). En qlinecontrol.cpp, puede ver más detalles. Solo quiero saber si podría hacerse de una manera fácil. –

Respuesta

4

Oh, he encontrado la respuesta:

Uso señal "textEdited" en lugar de "TextChanged".

Depuración El código fuente de QT me dio la respuesta.

+0

Esto también me ha ayudado un poco, pero sigo teniendo fallas de segmentación cuando intento profundizar en un directorio, por favor mire el código en [pegar contenedor] (http://pastebin.com/Jxziq8hW) .. –

1

se puede usar algo como esto:

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

Uso filterMode : Qt::MatchFlags propiedad. Esta propiedad contiene cómo se realiza el filtrado. Si filterMode está establecido en Qt::MatchStartsWith, solo se mostrarán las entradas que comiencen con los caracteres escritos. Qt::MatchContains mostrará las entradas que contienen los caracteres escritos, y Qt::MatchEndsWith los que terminan con los caracteres escritos. Actualmente, solo estos tres modos están implementados. Establecer filterMode en cualquier otro Qt::MatchFlag emitirá una advertencia y no se realizará ninguna acción. El modo predeterminado es Qt::MatchStartsWith.

Esta propiedad se introdujo en Qt 5.2.

funciones de acceso:

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