QCompleter,如何从数据库中获取Id

时间:2014-06-11 21:53:06

标签: c++ mysql qt qt5 qcompleter

经过大量的网络搜索而没有找到正确的答案后,我向你们寻求帮助......所以,让我们看看能不能解释一下。

我正在使用Qt 5进行用户界面,我想要lineEdit自动完成。我知道我可以使用QCompleter,它运行正常。我使用QCompleter迭代的查询填充for。但我需要知道那个领域的ID。

如果我正在对具有Product_NameProduct_Code的数据库进行查询,则用户将键入产品的名称,并在每个text_edit事件中填写带有新数据的QCompleter。但是,当用户选择产品时,我想在其他地方显示代码。当然,可能有两个或更多具有相同名称但代码不同的产品,因此我无法在搜索后查找代码。

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

我已经尝试使用隐藏列(包含代码)创建QTableWidget并将其显示在QlineEdit的底部(以模拟Qcompleter)。它看起来很好,而且有效...但我不知道如何添加QCompleter所具有的功能,例如Arrow Down将跳入表中,并在lineEdit丢失时消失焦点,但不是在选择表格时。

1 个答案:

答案 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在行编辑中显示与用户输入匹配的记录。