在QLineEdit中更改QCompleter结果

时间:2013-01-17 02:34:31

标签: qt

QLineEdit用于输入邮政编码。用户还可以输入城市名称,而QCompleter将显示用户可以选择的名称列表。问题是,在完成者中选择名称时,如何将邮政编码放入QLineEdit? 我尝试将QCompleter::activatedQModelIndex)连接到将QLineEdit文本更改为发布代码的插槽。但后来文本又被QLineEdit设置为城市名称。

1 个答案:

答案 0 :(得分:1)

抱歉,我之前的回答不正确,所以我编辑了它。

正如文件所说:

  

QString QCompleter :: pathFromIndex(const QModelIndex& index)const   [虚拟]

     

返回给定索引的路径。完成对象   使用它从底层模型中获取完成文本。该   默认实现返回列表项的编辑角色   楷模。如果模型是QDirModel,则返回绝对文件路径。

通过继承QCompleter并重新实现pathFromIndex,我得到了您所需要的:

class CodeCompleter : public QCompleter
{
    Q_OBJECT
public:
    explicit CodeCompleter(QObject *parent = 0);

    static const int CompleteRole;

    QString pathFromIndex(const QModelIndex &index) const;
};

const int CodeCompleter::CompleteRole = Qt::UserRole + 1;

CodeCompleter::CodeCompleter(QObject *parent) :
    QCompleter(parent)
{

}

QString
CodeCompleter::pathFromIndex(const QModelIndex &index) const
{
    QMap<int, QVariant> data = model()->itemData(index);
    QString code = data.value(CompleteRole).toString();
    return code;
}

你可以像这样使用它:

QStringList cities;
    cities << "Moscow" << "London" << "Las Vegas" << "New York";

    QStandardItemModel *model = new QStandardItemModel;
    for (int i = 0; i < cities.count(); ++i)
    {
        QString city = cities.at(i);
        QString code = city.at(0) + QString::number(city.length());///< just an example

        QStandardItem *item = new QStandardItem;
        item->setText(city);
        item->setData(code, CodeCompleter::CompleteRole);

        model->appendRow(item);
    }

    QLineEdit *lineEdit = new QLineEdit(this);

    CodeCompleter *completer = new CodeCompleter(this);
    completer->setModel(model);
    completer->setCaseSensitivity(Qt::CaseInsensitive);
    lineEdit->setCompleter(completer);