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

标签 c++ mysql qt qt5 qcompleter

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

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

如果我正在对具有 Product_NameProduct_Code 的数据库进行查询,用户将键入产品名称,并且在每个 text_edit 事件我用新数据填充QCompleter。但是,当用户选择产品时,我想在其他地方显示代码。当然,也有可能出现两个或多个同名不同编码的产品,所以查找后就找不到编码了。

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

我已经尝试制作一个带有隐藏列(带有代码)的 QTableWidget 并将其显示在 QlineEdit 的底部(模拟 Qcompleter).它看起来不错,而且可以工作......但我不知道如何添加 QCompleter 具有的功能,例如 Arrow Down 会跳到表格中,并在 时使其消失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));
}

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

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

关于c++ - QCompleter,如何从数据库中获取 Id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24173220/

相关文章:

c++ - Android.mk - 包含 OpenCV 目录,用于使用 NDK 进行 native C++ 编译

python - SWIG Python C/C++。结果模块是空的,没有错误

php - Laravel 5 使用具有许多关系的数据透视表

mysql - Spring Boot 中的外键(MySQL、Hibernate、JPA)

MySQL:我应该使用哪一个?为什么?

c++ - Qt 和 Visual Studio。托盘图标消失

qt - 错误 : C2248: 'QVariant::QVariant' : cannot access private member declared in class 'QVariant'

C++ 常量引用语义?

c++将 union 转换为其成员类型之一

c++ - 如何正确关闭我创建的 QProcess?