Qt自定义视图委托(练习记录)

该代码示例展示了如何创建一个自定义的QItemDelegate子类MyItemDelegate,用于在QTableView中使用QSpinBox作为编辑器。当数据项需要编辑时,delegate创建编辑器,设置数据,更新几何布局,并在编辑完成后将新值写回模型。
摘要由CSDN通过智能技术生成
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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值