QCompleter, как получить идентификатор из базы данных

После МНОГО поиска в Интернете, но не нашел правильного ответа, я пришел за помощью к вам, ребята … Давайте посмотрим, смогу ли я это объяснить.

Я работаю над пользовательским интерфейсом с Qt 5, и я хочу lineEdit с автозаполнением. Я знаю, что могу использовать QCompleterи работает нормально. Я заполняю QCompleter с запросом, делающим for итерация. Но мне нужно знать идентификатор этого поля.

Если я делаю запрос к базе данных, которая имеет Product_Name и Product_Codeпользователь будет вводить название продукта, и в каждом text_edit событие, которое я заполняю QCompleter с новыми данными. Но, когда пользователь выбирает Продукт, я хочу показать код в другом месте. Конечно, может быть два или более продукта с одинаковым именем, но с разным кодом, поэтому я не могу искать код после поиска.

Итак, есть ли способ иметь два связанных поля в QCompleter?

Я уже пытаюсь сделать QTableWidget со скрытым столбцом (с кодом) и отображать его прямо в нижней части QlineEdit (для имитации Qcompleter). Это выглядит хорошо, и это работает … но я не знаю, как добавить функции, которые QCompleter имеет, как стрелка вниз прыгнет в стол, и заставит его исчезнуть, когда lineEdit теряет фокус, но не при выборе таблицы.

1

Решение

Вы можете сохранить дополнительные данные в полной модели:

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));
}

Но этот подход не будет работать, если пользователь не использует автозаполнение и вводит всю строку. В этом случае вы не сможете получить правильный идентификатор кода, если в БД более одной записи с одним и тем же именем.

Если вы пытаетесь создать какое-то поле поиска, я бы порекомендовал вам отобразить все ваши данные в виде таблицы и использовать QSortFilterProxyModel чтобы показать записи, соответствующие пользовательскому вводу в строке редактирования.

2

Другие решения


По вопросам рекламы [email protected]