QTableView + делегат QCompleter возвращает неправильное значение

Я использую Qt (C ++), в частности, у меня есть таблица, которая автоматически завершается с использованием QCompleter, я очень плохо знакомы с Qt и борются с этим.

Моя проблема в том, что хотя QCompleter показывает правильные значения, данные, которые он возвращает, всегда являются данными для первого элемента.

Например, если у меня есть следующие данные (поля, разделенные тире, данные составлены):

1-David-197598713-Los Angeles
2-Daniel-1933398713-NYC
3-Don-1975555-Argentina

А я типа D, QCompleter показывает 3 варианта, но независимо от того, что я выбираю, это происходит:

  1. Фактическая ячейка редактируется «правильно» (значение отражает то, что было выбрано)
  2. Обратный звонок получает НЕПРАВИЛЬНО значение (всегда идентификатор первого элемента)

Так что в этом случае я всегда получу (Предполагая, что имя — это поле автозаполнения):
1-Даниэль-197598713-Лос-Анджелес или же 1-Дон-197598713-Лос-Анджелес или же 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;
}

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]