0

Qt (C++) を使用しています。具体的には、QCompleter. 私はQtが初めてで、これに苦労しています

私の問題はQCompleter、正しい値が表示されていても、返されるデータが常に最初の要素のデータであることです。

たとえば、次のデータがある場合 (ダッシュで区切られたフィールド、構成されたデータ):

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

Dと入力すると、QCompleter に 3 つのオプションが表示されますが、どちらを選択しても、次のようになります。

  1. 実際のセルは「正しく」編集されます (値は選択されたものを反映します)
  2. コールバックは間違った値 (常に最初の要素の 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;
}
4

0 に答える 0