在QTableWidget中使用自定义委托组件

使用步骤

1.自定义委托组件

2.将委托设置给QTableWidget

自定义委托组件

1.继承自QItemDelegate

2.重写以下函数

  • virtual QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const//创建委托显示的控件
  • virtual void setEditorData(QWidget *editor, const QModelIndex &index) const//将控件中的数据设置到QTableWidget(此处以QTableWidget为例)
  • virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const//将控件中的数据设置到QTableWidget中
class FSpinBoxDelegate : public QItemDelegate
{
public:
	explicit FSpinBoxDelegate(QObject *parent = nullptr);
	~FSpinBoxDelegate();
protected:
	virtual QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
	virtual void setEditorData(QWidget *editor, const QModelIndex &index) const override;
	virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;
};

FSpinBoxDelegate::FSpinBoxDelegate(QObject *parent /*= nullptr*/)
	:QItemDelegate(parent)
{

}

FSpinBoxDelegate::~FSpinBoxDelegate()
{

}

QWidget* FSpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
	QSpinBox *spinBox = new QSpinBox(parent);
	return spinBox;
}

void FSpinBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
	QSpinBox * spinBox = dynamic_cast<QSpinBox*>(editor);
	if (spinBox)
	{
		spinBox->setValue(index.data().toInt());
	}
}

void FSpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
	QSpinBox * spinBox = dynamic_cast<QSpinBox*>(editor);
	if (spinBox)
	{
		model->setData(index, spinBox->value());
	}
}

在QTableWidget使用

class TableWidgetTest : public QTableWidget
{
	Q_OBJECT

public:
	TableWidgetTest(QWidget *parent = Q_NULLPTR);
	~TableWidgetTest();
};

TableWidgetTest::TableWidgetTest(QWidget *parent)
	: QTableWidget(parent)
{
	this->setColumnCount(3);
	this->setRowCount(5);
	for (int row = 0;row<5;++row)
	{
		for (int col = 0;col<3;++col)
		{
			QTableWidgetItem *item = new QTableWidgetItem;
			item->setText(QString("%1").arg(row * 5 + col));
			this->setItem(row, col, item);
		}
	}
	FSpinBoxDelegate* dg = new FSpinBoxDelegate(this);
	this->setItemDelegateForColumn(2, dg);

/*	FSpinBoxDelegate stackDg;
	this->setItemDelegateForColumn(2, &stackDg);//表格的第二列 设置委托
	//此种设置方式会导致崩溃
	*/
}

TableWidgetTest::~TableWidgetTest()
{

}

问题记录

之前有朋友碰到过双击表格但是不出现委托控件的问题。现给出如下三个方向帮助大家排查(此处以QTableWidget为例)

  1. 设置委托的列数是否正确
  2. QTableWidget本身是否可以进行编辑
  3. QTableWidgetItem本身是否可以进行编辑

说明

1.例如表格只有三列。但是将委托设置的列数设置到了错的列错(例如第四列,第五列等)

2.看看QTableWidget是否调用了setEditTriggers(QAbstractItemView::NoEditTriggers); 导致QTableWidget无法编辑。

3.看看QTableWidgetItem是否设置了不允许编辑的属性 setFlags(Qt::NoItemFlags); 导致QTableWidget可以允许编辑,但是QTableWidgetItem本身无法编辑

猜你喜欢

转载自blog.csdn.net/weixin_39308337/article/details/114768756