如何动态更新QCompleter的模型

时间:2009-12-18 09:53:39

标签: qt model qcompleter

我将QCompleterQLineEdit一起使用,我希望动态更新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时,它会给我一个包含h0h1h2的自动完成列表,我可以使用keyborad来选择项目。但它没有像我预期的那样行为。

似乎应该在QLineEdit发出textChanged信号之前设置模型。一种方法是重新实现keyPressEvent,但它涉及获取QLineEdit文本的许多条件。

所以,我想知道有一种动态更新QCompleter模型的简单方法吗?

3 个答案:

答案 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)