我正在使用 Qt (C++),特别是我有一个使用QCompleter
. 我对 Qt很陌生并且为此苦苦挣扎。
我的问题是,即使QCompleter
显示正确的值,它返回的数据始终是第一个元素的数据。
例如,如果我有以下数据(由破折号分隔的字段,数据组成):
1-David-197598713-Los Angeles
2-Daniel-1933398713-NYC
3-Don-1975555-Argentina
我输入D, QCompleter 显示 3 个选项,但无论我选择哪个,都会发生这种情况:
- 实际的单元格编辑“正确”(该值反映了所选择的内容)
- 回调接收到错误值(总是第一个元素的 ID)
所以在这种情况下,我总是会得到(假设名称是自动完成字段):1-Daniel-197598713-Los Angeles或1-Don-197598713-Los Angeles或1-David-197598713-Los Angeles
此外,出于某种动机,setEditorData 过程根本不做任何事情(如果我评论它,行为根本不会改变)
这是我的整个委托来源:
productNameDelegate::productNameDelegate(QObject *parent) : QItemDelegate(parent)
{
}
QWidget *productNameDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &/* option */,
const QModelIndex &/* index */) const
{
QLineEdit *editor = new QLineEdit(parent);
QCompleter *q = new QCompleter(db::getProductsNames());
q->setCaseSensitivity(Qt::CaseInsensitive);
q->setCompletionMode(QCompleter::PopupCompletion);
editor->setCompleter(q);
return editor;
}
void productNameDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{ //TODO this procedure doesn't affect the code at all
QString value = index.model()->data(index, Qt::EditRole).toString();
QLineEdit *LineEdit = static_cast<QLineEdit*>(editor);
LineEdit->setText(value);
}
void productNameDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
QLineEdit *LineEdit = static_cast<QLineEdit*>(editor);
QString value = LineEdit->text();
int code=LineEdit->completer()->currentIndex().data(Qt::UserRole).toInt(); //FIXME: siempre devuelve el primer elemento de la lista
if (index.column()==2 && index.row()>=6 && index.row() <= 25)
m->addProducto(code, index.row());
model->setData(index, value, Qt::EditRole);
}
void productNameDelegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
editor->setGeometry(option.rect);
}
void productNameDelegate::setModel(factura* m) {
this->m=m;
}