2014-06-11 28 views
0

经过很多搜索没有正确答案的网页后,我来帮助你们......所以让我看看我能否解释它。QCompleter,如何从数据库中获得Id

我正在使用QT5的用户界面,我希望通过自动填充来编辑行。我知道我可以使用QCompleter,它工作正常。我用Qry填充QCompleter进行迭代(for)。但我需要知道该字段的ID。

例如:

如果我做一个查询到具有PRODUCT_NAME和PRODUCT_CODE数据库,用户将键入prodcut的名称,并在每个text_edit事件我填的是QCompleter用新数据,但是当用户选择产品时,我想在其他地方展示代码,当然可能有两个或多个产品具有相同的名称但代码不同,因此在搜索后我无法查找代码。

那么有没有办法在QCompleter中拥有两个realted字段?

我已经试着制作一个带有隐藏列的QTableWidget(带代码)并将其显示在QlineEdit的底部(模拟Qcompleter),它看起来很好,它可以工作......但我不知道如何添加Qcompleter所具有的功能,向下箭头将跳到表中,并且在lineedit失去焦点时使其消失,但在选择表时不会。

任何帮助将不胜感激!感谢您抽出宝贵时间阅读本文,并对错误的英文感到抱歉!

回答

1

你可以把额外的数据在完成试验模型:

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

然后你连接到QCompleteractivated(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在行编辑中显示与用户输入相匹配的记录。