QTableView + QCompleter委托返回错误的值

时间:2015-01-08 04:20:53

标签: c++ qt delegates 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. 回调收到错误值(始终是第一个元素的ID)
  3. 所以在这种情况下,我总是得到(假设名称是自动完成字段): 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;
    }
    

0 个答案:

没有答案