如何在QT中以编程方式更改QItemDelegate的值

时间:2013-06-26 19:23:48

标签: qt qcombobox qitemdelegate qstandarditemmodel

我已经检查了许多似乎相似的主题,但他们没有帮助,所以我问这个问题。如果您知道已经存在的任何重复问题,请指导我。

我的情况:

我有一个(QCombobox)QItemDelegate用于带有QStandardModel的QTableView的1列。现在,当我直接编辑值或使用组合框进行选择时,它可以正常工作。但我也试图提供一个保存表状态的选项,以便我可以在需要时重新加载它。

问题:

在我以编程方式设置项目时重新加载时,它不会反映在表格中。

我试过了两次

1)得到索引&使用setData和

2)检索QStandardItem&设置文本。

我还发现没有调用setEditorData。我究竟做错了什么?如何通过代码设置此类单元格的值?

编辑:一些细节

我将QItemDelegate子类化为DropDown。

dropdown.h

#ifndef DROPDOWN_H
#define DROPDOWN_H

#include <QItemDelegate>
#include <QWidget>
#include <QStringListModel>
#include <QStringList>

class DropDown : public QItemDelegate
{
    Q_OBJECT
public:
    explicit DropDown(QObject *parent = 0);

    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    void setComboData(QStringList list);
    QStringList getComboData();

private:
    QStringListModel *listmodel;

signals:

public slots:

};

#endif // DROPDOWN_H

dropdown.cpp

#include "dropdown.h"
#include <QComboBox>

DropDown::DropDown(QObject *parent) :
    QItemDelegate(parent)
{
    listmodel = new QStringListModel(parent);
}

QWidget *DropDown::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QComboBox *editor = new QComboBox(parent);
    editor->setEditable(true);
    editor->setInsertPolicy(QComboBox::NoInsert);
    editor->setModel(listmodel);
    return editor;
}

void DropDown::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    QString value = index.model()->data(index,Qt::EditRole).toString();
    QComboBox *original = static_cast<QComboBox *>(editor);
    original->setCurrentIndex(original->findText(value));
}

void DropDown::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{    
    QComboBox *original = static_cast<QComboBox *>(editor);
    QString value = original->currentText();
    model->setData(index, value, Qt::EditRole);
}

void DropDown::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}

void DropDown::setComboData(QStringList list)
{
    listmodel->setStringList(list);
}

QStringList DropDown::getComboData()
{
    return listmodel->stringList();
}

这就是它在表格中的使用方式。

model = new QStandardItemModel(0,11, this);//i update row count later while adding items.
ui->itemTable->setModel(model);

sourceSet = new DropDown(this);
ui->itemTable->setItemDelegateForColumn(3, sourceSet);

0 个答案:

没有答案