在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本身无法编辑

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
QTableWidget 是 Qt 框架的一个表格控件,它可以显示和编辑表格数据。而委托(Delegate)则允许我们自定义表格的单元格的显示和编辑方式。所谓的“全家桶”,是指我们可以自定义委托来实现对单元格的各种操作,包括绘制、编辑、校验等。 下面是一个简单的示例,展示了如何自定义委托来实现对 QTableWidget 的全家桶操作: ```python from PyQt5.QtWidgets import QTableWidget, QTableWidgetItem, QComboBox, QLineEdit, QDoubleSpinBox, QStyledItemDelegate from PyQt5.QtCore import Qt class CustomDelegate(QStyledItemDelegate): def createEditor(self, parent, option, index): # 创建编辑器 editor = None if index.column() == 0: # 第一列使用 QComboBox editor = QComboBox(parent) editor.addItems(['Option 1', 'Option 2', 'Option 3']) elif index.column() == 1: # 第二列使用 QLineEdit editor = QLineEdit(parent) elif index.column() == 2: # 第三列使用 QDoubleSpinBox editor = QDoubleSpinBox(parent) editor.setDecimals(2) editor.setRange(0.0, 100.0) return editor def setEditorData(self, editor, index): # 设置编辑器显示数据 value = index.data(Qt.EditRole) if isinstance(editor, QComboBox): editor.setCurrentText(value) else: editor.setText(str(value)) def setModelData(self, editor, model, index): # 更新数据到模型 if isinstance(editor, QComboBox): model.setData(index, editor.currentText(), Qt.EditRole) else: model.setData(index, editor.text(), Qt.EditRole) def updateEditorGeometry(self, editor, option, index): # 设置编辑器的显示位置和大小 editor.setGeometry(option.rect) # 创建 QTableWidget table_widget = QTableWidget(3, 3) table_widget.setItemDelegate(CustomDelegate()) # 设置表头 table_widget.setHorizontalHeaderLabels(['Column 1', 'Column 2', 'Column 3']) # 填充数据 for row in range(3): for col in range(3): item = QTableWidgetItem(f'Item {row}-{col}') table_widget.setItem(row, col, item) # 显示表格 table_widget.show() ``` 在这个示例,我们自定义了一个 CustomDelegate 类,继承自 QStyledItemDelegate。在 createEditor 方法,我们根据列的索引创建不同类型的编辑器,比如 QComboBox、QLineEdit 和 QDoubleSpinBox。然后通过 setEditorData 和 setModelData 方法来设置编辑器的显示数据和更新数据到模型。最后,通过 updateEditorGeometry 方法来设置编辑器的显示位置和大小。 通过这种方式,我们可以灵活地控制 QTableWidget 单元格的显示和编辑方式,实现各种自定义需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一路初心向前

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值