经过大量的网络搜索而没有找到正确的答案后,我向你们寻求帮助......所以,让我们看看能不能解释一下。
我正在使用Qt 5进行用户界面,我想要lineEdit
自动完成。我知道我可以使用QCompleter
,它运行正常。我使用QCompleter
迭代的查询填充for
。但我需要知道那个领域的ID。
如果我正在对具有Product_Name
和Product_Code
的数据库进行查询,则用户将键入产品的名称,并在每个text_edit
事件中填写带有新数据的QCompleter
。但是,当用户选择产品时,我想在其他地方显示代码。当然,可能有两个或更多具有相同名称但代码不同的产品,因此我无法在搜索后查找代码。
那么,有没有办法在QCompleter
中有两个相关的字段?
我已经尝试使用隐藏列(包含代码)创建QTableWidget
并将其显示在QlineEdit
的底部(以模拟Qcompleter
)。它看起来很好,而且有效...但我不知道如何添加QCompleter
所具有的功能,例如Arrow Down将跳入表中,并在lineEdit
丢失时消失焦点,但不是在选择表格时。
答案 0 :(得分: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));
}
但是如果用户没有使用自动完成并输入整个字符串,这种方法就不会起作用。在这种情况下,如果数据库中有多个具有相同名称的记录,您将无法获得正确的代码ID。
如果您尝试创建某种搜索字段,我建议您在某些表视图中显示所有数据,并使用QSortFilterProxyModel
在行编辑中显示与用户输入匹配的记录。