C++ 实现QTableWidget单个单元格设置代理
时间: 2023-10-25 15:06:34 浏览: 238
在 QTableWidget 中,可以使用 QItemDelegate 实现对单个单元格的自定义代理设置。下面是一个简单的示例,演示如何使用 QSpinBox 设置某个单元格的代理:
```cpp
#include <QApplication>
#include <QTableWidget>
#include <QSpinBox>
#include <QItemDelegate>
class SpinBoxDelegate : public QItemDelegate
{
public:
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
QSpinBox *editor = new QSpinBox(parent);
editor->setMinimum(0);
editor->setMaximum(100);
return editor;
}
void setEditorData(QWidget *editor, const QModelIndex &index) const override
{
int value = index.model()->data(index, Qt::EditRole).toInt();
QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
spinBox->setValue(value);
}
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
{
QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
int value = spinBox->value();
model->setData(index, value, Qt::EditRole);
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTableWidget *tableWidget = new QTableWidget();
tableWidget->setRowCount(3);
tableWidget->setColumnCount(2);
tableWidget->setHorizontalHeaderLabels({"Column 1", "Column 2"});
tableWidget->setVerticalHeaderLabels({"Row 1", "Row 2", "Row 3"});
// 设置某个单元格的代理
SpinBoxDelegate *delegate = new SpinBoxDelegate;
tableWidget->setItemDelegateForColumn(1, delegate);
tableWidget->setItem(1, 1, new QTableWidgetItem());
tableWidget->show();
return a.exec();
}
```
在上面的示例中,我们定义了一个 SpinBoxDelegate 类,继承自 QItemDelegate,并重写了 createEditor、setEditorData 和 setModelData 三个函数,实现了对单元格的代理设置。然后,我们将这个自定义代理设置给第 2 列的单元格,然后在该单元格上显示一个空 QTableWidgetItem,这样就可以通过该项 QTableWidgetItem 包含的编辑器控件,来编辑该单元格的值。运行程序,可以看到第 2 列的单元格变成了一个 QSpinBox,可以通过它来编辑单元格的值。
阅读全文