Как обновить модель QCOMPLETER динамично

Я использую 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смоделировать динамично?

7
задан AAEM 15 May 2018 в 19:43
поделиться