1

正しい答えを見つけられずにウェブをたくさん検索した後、私はあなたたちから助けを求めてきました...それで私がそれを説明できるか見てみましょう.

私は Qt 5 で UI に取り組んでおり、lineEditオートコンプリートが必要です。を使用できることはわかってQCompleterおり、正常に動作します。繰り返しQCompleterを行うクエリを入力しforます。しかし、そのフィールドの ID を知る必要があります。

と を含むデータベースに対してクエリを実行している場合Product_NameProduct_Codeユーザーは製品の名前を入力し、各text_editイベントで にQCompleter新しいデータを入力します。しかし、ユーザーが製品を選択したときに、コードを別の場所に表示したい。もちろん、同じ名前でコードが異なる製品が 2 つ以上存在する可能性があるため、検索後にコードを探すことはできません。

では、関連する 2 つのフィールドを に含める方法はありQCompleterますか?

私はすでに非表示の列 (コードを使用) を作成し、それを(をシミュレートするために)QTableWidgetの一番下に表示しようとしています。それはうまく見えますが、機能します...しかし、下矢印がテーブルに飛び込んで、フォーカスを失ったときに消えるようにする機能を追加する方法がわかりませんが、テーブルが選択されたときではありません。QlineEditQcompleterQCompleterlineEdit

4

1 に答える 1

2

完全なモデルに追加のデータを保持できます。

QMap<int, QString> data;
data[0] = "Moscow";
data[1] = "London";
data[2] = "Paris";

QCompleter *completer = new QCompleter(this);

QStandardItemModel *model = new QStandardItemModel(completer);
QMapIterator<int, QString> it(data);
while (it.hasNext())
{
    it.next();

    int code = it.key();
    QString name = it.value();

    QStandardItem *item = new QStandardItem;
    item->setText(name);
    item->setData(code, Qt::UserRole);

    model->appendRow(item);
}

completer->setModel(model);

次に、QCompleter activated(const QModelIndex &index)シグナルに接続してオートコンプリート アクションをキャッチし、必要な追加データを表示します。

connect(completer, SIGNAL(activated(QModelIndex)),
            this, SLOT(onItemActivated(QModelIndex)));

void Widget::onItemActivated(const QModelIndex &index)
{
    int code = index.data(Qt::UserRole).toInt();

    codeEdit->setText(QString::number(code));
}

ただし、ユーザーがオートコンプリートを使用せずに文字列全体を入力する場合、このアプローチは機能しません。その場合、DB に同じ名前のレコードが複数あると、正しいコード ID を取得できません。

ある種の検索フィールドを作成しようとしている場合は、すべてのデータを何らかのテーブル ビューに表示し、QSortFilterProxyModelユーザー入力に一致するレコードを行編集で表示するために使用することをお勧めします。

于 2014-06-12T04:49:04.380 に答える