使用步骤
1.自定义委托组件
2.将委托设置给QTableWidget
自定义委托组件
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为例)
- 设置委托的列数是否正确
- QTableWidget本身是否可以进行编辑
- QTableWidgetItem本身是否可以进行编辑
说明
1.例如表格只有三列。但是将委托设置的列数设置到了错的列错(例如第四列,第五列等)
2.看看QTableWidget是否调用了setEditTriggers(QAbstractItemView::NoEditTriggers); 导致QTableWidget无法编辑。
3.看看QTableWidgetItem是否设置了不允许编辑的属性 setFlags(Qt::NoItemFlags); 导致QTableWidget可以允许编辑,但是QTableWidgetItem本身无法编辑