我将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
模型的简单方法吗?
答案 0 :(得分:4)
哦,我找到了答案:
使用信号textEdited
代替textChanged
。
推销QT的源代码告诉我答案。
答案 1 :(得分:1)
您可以使用以下内容:
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);
}
答案 2 :(得分:0)
使用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)