Как динамически обновить модель QCompleter - PullRequest
7 голосов
/ 18 декабря 2009

Я использую QCompleter с QLineEdit и хочу динамически обновлять модель QCompleter. т.е. содержимое модели обновляется в соответствии с текстом QLineEdit.

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

Я ожидаю, что когда я введу h, он должен дать мне список автозаполнения с h0, h1 и h2, и я могу использовать keyborad для выбора элемента. Но это не так, как я ожидал.

Кажется, что модель должна быть установлена ​​до того, как QLineEdit испустит сигнал textChanged. Один из способов - переопределить keyPressEvent, но для получения текста QLineEdit требуется много условий.

Итак, я хочу знать, есть ли простой способ динамического обновления модели QCompleter?

Ответы [ 3 ]

4 голосов
/ 18 декабря 2009

О, я нашел ответ:

Используйте сигнал textEdited вместо textChanged.

Отладка исходного кода QT подсказала мне ответ.

1 голос
/ 23 мая 2014

Вы можете использовать что-то вроде этого:

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 голосов
/ 29 января 2015

Использовать filterMode : Qt::MatchFlags свойство. Это свойство содержит порядок выполнения фильтрации. Если для filterMode установлено значение Qt::MatchStartsWith, будут отображаться только те записи, которые начинаются с напечатанных символов. Qt::MatchContains отобразит записи, которые содержат напечатанные символы, а Qt::MatchEndsWith те, которые заканчиваются напечатанными символами. В настоящее время реализованы только эти три режима . Установка для filterMode любого другого Qt::MatchFlag выдаст предупреждение, и никаких действий не будет выполнено. Режим по умолчанию Qt::MatchStartsWith.

Это свойство было введено в Qt 5.2.

Функции доступа:

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