После МНОГО поиска в Интернете, но не нашел правильного ответа, я пришел за помощью к вам, ребята … Давайте посмотрим, смогу ли я это объяснить.
Я работаю над пользовательским интерфейсом с Qt 5, и я хочу lineEdit
с автозаполнением. Я знаю, что могу использовать QCompleter
и работает нормально. Я заполняю QCompleter
с запросом, делающим for
итерация. Но мне нужно знать идентификатор этого поля.
Если я делаю запрос к базе данных, которая имеет Product_Name
и Product_Code
пользователь будет вводить название продукта, и в каждом text_edit
событие, которое я заполняю QCompleter
с новыми данными. Но, когда пользователь выбирает Продукт, я хочу показать код в другом месте. Конечно, может быть два или более продукта с одинаковым именем, но с разным кодом, поэтому я не могу искать код после поиска.
Итак, есть ли способ иметь два связанных поля в QCompleter
?
Я уже пытаюсь сделать QTableWidget
со скрытым столбцом (с кодом) и отображать его прямо в нижней части QlineEdit
(для имитации Qcompleter
). Это выглядит хорошо, и это работает … но я не знаю, как добавить функции, которые QCompleter
имеет, как стрелка вниз прыгнет в стол, и заставит его исчезнуть, когда lineEdit
теряет фокус, но не при выборе таблицы.
Вы можете сохранить дополнительные данные в полной модели:
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
чтобы показать записи, соответствующие пользовательскому вводу в строке редактирования.