class MyItemDelegate : public QItemDelegate
{
Q_OBJECT
public:
MyItemDelegate(QObject *parent);
~MyItemDelegate();
virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
virtual void setEditorData(QWidget *editor, const QModelIndex &index) const;
virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
virtual void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
MyItemDelegate::MyItemDelegate(QObject *parent)
: QItemDelegate(parent)
{
}
MyItemDelegate::~MyItemDelegate()
{
}
// 创建编辑器: 在需要编辑时才会创建
QWidget* MyItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QSpinBox *editor = new QSpinBox(parent);
editor->setMinimum(0);
editor->setMaximum(100);
return editor;
}
// 为编辑器设置数据
void MyItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
int value = index.model()->data(index, Qt::EditRole).toInt();
QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
spinBox->setValue(value);
}
// 将数据写入到模型. 当用户完成编辑时,视图会通过setModelData告知委托
void MyItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
spinBox->interpretText();
int value = spinBox->value();
model->setData(index, value, Qt::EditRole);
}
// 更新编辑几何布局
void MyItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
editor->setGeometry(option.rect);
// 委托管理编辑器的几何布局. 在创建编辑器以及视图中项目大小位置改变时设置它的几何布局.
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QStandardItemModel model;
QStandardItem* parentItem = model.invisibleRootItem();
QStandardItem* item0 = new QStandardItem;
item0->setText("1");
QPixmap pixmap0(50, 50);
pixmap0.fill("red");
item0->setIcon(QIcon(pixmap0));
item0->setToolTip("indexA");
parentItem->appendRow(item0);
QStandardItem* item1 = new QStandardItem;
item1->setText("2");
QPixmap pixmap1(50, 50);
pixmap1.fill("blue");
item1->setIcon(QIcon(pixmap1));
item1->setToolTip("indexB");
parentItem->appendRow(item1);
QStandardItem* item2 = new QStandardItem;
QPixmap pixmap2(50, 50);
pixmap2.fill("green");
item2->setData("3", Qt::EditRole);
item2->setData("indexC", Qt::ToolTipRole);
item2->setData(QIcon(pixmap2), Qt::DecorationRole);
parentItem->appendRow(item2);
QTableView view;
view.setModel(&model);
view.setItemDelegate((new MyItemDelegate(&view)));
view.show();
return a.exec();
}