QStyledItemDelegate 用法举例 ,c plus plus
时间: 2024-01-25 21:04:13 浏览: 105
QStyledItemDelegate 是 Qt 中的一个委托类,用于自定义表格、列表等控件的单元格的显示和编辑。下面是一个 QStyledItemDelegate 的用法举例:
1. 创建自定义委托类
首先需要创建一个自定义委托类,继承自 QStyledItemDelegate 类。例如:
```c++
class MyItemDelegate : public QStyledItemDelegate
{
public:
MyItemDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {}
QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
void setEditorData(QWidget *editor, const QModelIndex &index) const override;
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
};
```
2. 实现委托类的函数
接下来需要实现委托类的四个函数,分别是 createEditor、setEditorData、setModelData 和 updateEditorGeometry 函数。
createEditor 函数用于创建一个编辑器控件,返回一个 QWidget 指针。例如:
```c++
QWidget* MyItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QSpinBox *editor = new QSpinBox(parent);
editor->setFrame(false);
editor->setMinimum(0);
editor->setMaximum(100);
return editor;
}
```
setEditorData 函数用于将数据显示在编辑器控件上,例如:
```c++
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 函数用于将编辑器控件中的数据保存到数据模型中,例如:
```c++
void MyItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
int value = spinBox->value();
model->setData(index, value, Qt::EditRole);
}
```
updateEditorGeometry 函数用于更新编辑器控件的位置和大小,例如:
```c++
void MyItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
editor->setGeometry(option.rect);
}
```
3. 使用自定义委托类
最后,在需要使用自定义委托类的控件中,通过 setItemDelegate 函数设置委托类。例如:
```c++
QTableView *tableView = new QTableView();
MyItemDelegate *delegate = new MyItemDelegate();
tableView->setItemDelegate(delegate);
```
这样,就可以自定义表格中单元格的显示和编辑了。
阅读全文