在搜索了很多网络之后没有找到正确的答案,我来寻求你们的帮助.让我看看我能不能解释一下。
我正在用Qt 5开发一个UI,我想要一个自动完成的lineEdit。我知道我可以使用QCompleter,而且它工作得很好。我在QCompleter中填充了一个执行for迭代的查询。但我需要知道那个领域的身份。
如果我对具有Product_Name和Product_Code的数据库进行查询,用户将输入产品的名称,在每个text_edit事件中,我都会向QCompleter填充新的数据。但是,当用户选择Product时,我想在其他地方显示代码。当然,可能有两个或更多的产品具有相同的名称,但代码不同,所以我无法在搜索后查找代码。
那么,是否有一种方法可以在QCompleter中有两个相关字段
我已经尝试用隐藏的列(带有代码)创建一个QTableWidget,并将其显示在QlineEdit的底部(以模拟Qcompleter)。看起来很好,而且很管用..。但我不知道如何添加QCompleter所具有的函数,比如Arrow将跳入表中,并在lineEdit失去焦点时使其消失,而不是在选择表时消失。
发布于 2014-06-12 04:49:04
您可以在completer模型中保存其他数据:
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));
}但是,如果用户不使用自动完成并键入整个字符串,则此方法将无法工作。在这种情况下,如果DB中有多个具有相同名称的记录,则无法获得正确的代码id。
如果您试图创建某种搜索字段,我建议您在某个表视图中显示所有数据,并使用QSortFilterProxyModel在行编辑中显示与用户输入相匹配的记录。
https://stackoverflow.com/questions/24173220
复制相似问题