1

在网上搜索了很多都没有找到正确答案之后,我来寻求你们的帮助......所以让我们看看我是否能解释一下。

我正在使用 Qt 5 开发 UI,我想要一个lineEdit自动完成的 UI。我知道我可以使用QCompleter,而且效果很好。QCompleter我用做for迭代的查询填充。但我需要知道该字段的 ID。

如果我正在对具有Product_Name和 的数据库进行查询Product_Code,用户将键入产品的名称,并且在每种情况下我都会用新数据text_edit填充。QCompleter但是,当用户选择产品时,我想在其他地方显示代码。当然,可能有两个或多个同名但代码不同的产品,所以我搜索后无法找到代码。

那么,有没有办法在一个中拥有两个相关的字段QCompleter

我已经尝试QTableWidget使用隐藏列(带有代码)制作 a 并将其显示在底部QlineEdit(以模拟Qcompleter)。它看起来不错,并且可以工作...但是我不知道如何添加具有的功能QCompleter,例如向下箭头会跳入表格,并在lineEdit失去焦点时使其消失,但在选择表格时不会消失。

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

但是,如果用户不使用自动完成并键入整个字符串,这种方法将不起作用。在这种情况下,如果数据库中有多个同名记录,您将无法获得正确的代码 ID。

如果您尝试创建某种搜索字段,我建议您在某个表格视图中显示所有数据,并用于QSortFilterProxyModel在行编辑中显示与用户输入匹配的记录。

于 2014-06-12T04:49:04.380 回答