0

QLineEdit郵便番号を入力するためのものです。ユーザーは都市名を入力することもできますがQCompleter、ユーザーが選択できる名前のリストが表示されます。問題は、コンプリーターで名前を選択する際に、郵便番号をどのように入力できるかということQLineEditです。テキストを郵便番号に変更するスロットにQCompleter::activated( )を接続しようとしました。しかし後で、テキストは再び。によって都市名に設定されました。QModelIndexQLineEditQLineEdit

4

1 に答える 1

2

申し訳ありませんが、以前の回答が正しくなかったため、編集しました。

ドキュメントにあるように:

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

指定されたインデックスのパスを返します。コンプリーターオブジェクトはこれを使用して、基になるモデルから完了テキストを取得します。デフォルトの実装は、リストモデルのアイテムの編集ロールを返します。モデルが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);
于 2013-01-17T07:14:01.760 に答える