我使用QCompleter和QLineEdit,並且我想動態更新QCompleter的模型。即模型的內容根據QLineEdit的文本更新。如何動態更新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);
}
我希望當我輸入 「H」,它應該給我 「H0」 一個自動完成列表,「h1」和「h2」,我可以使用keyborad選擇項目。但它不像我預期的那樣。
看來應該在QLineEdit發出「textChanged」信號之前設置模型。一種方法是重新實現「keyPressEvent」,但它涉及許多條件來獲取QLineEdit的文本。
所以,我想知道是否有一種簡單的方法來動態更新QCompleter的模型?
我已經試過事件,它的工作原理,但它是不容易的使用有這麼多類型的按鍵(例如Backspace鍵......)的。在qlinecontrol.cpp中,你可以看到更多細節。我只是想知道它能以簡單的方式完成嗎? – 2009-12-18 15:28:57