setItemDelegete();该函数可以自定义委托类
该例子为Qt官网的一个例子:使用QSpinBox来提供编辑功能
- 首先创建一个项目:名为object
- 在项目中添加一个c++类,类名为SpinBoxDelegate
修改该类的基类:更改为QImageDelegate,然后需要添加重写一些函数
SpinBoxDelegate.h文件:
#ifndef SPINBOXDELEGATE_H
#define SPINBOXDELEGATE_H
#include<QItemDelegate>
class SpinBoxDelegate : public QItemDelegate
{
Q_OBJECT
public:
explicit SpinBoxDelegate(QObject *parent = nullptr);
//创建编辑器
QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option,
const QModelIndex &index) const ;
//设置编辑器数据
void setEditorData(QWidget *editor, const QModelIndex &index) const;
//设置模型数据
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
//设置显示的几何图形
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
signals:
};
#endif // SPINBOXDELEGATE_H
以下为这4个函数的使用:在SpinBoxDelegate.cpp中添加以下函数
1.提供编辑器(createEditor)
添加委托时需要在该函数中指定控件
请注意,我们不需要保留指向编辑器小部件的指针,因为视图负责在不再需要它时销毁它
QWidget * SpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
QSpinBox *spin=new QSpinBox(parent);//创建一个SpinBOx控件
spin->setMinimum(0);//设置最小值
spin->setMaximum(100);//设置最大值
return spin;//返回该控件
}
2.设置编辑器的数据
委托必须提供一个函数来将模型数据复制到编辑器中。在此示例中,我们读取存储在显示角色中的数据,并相应地设置数字显示框中的值
void SpinBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
int number=index.model()->data(index,Qt::EditRole).toInt();//获取数值,并转化格式
QSpinBox *spinbox=static_cast<QSpinBox*>(editor);//强制转换
spinbox->setValue(number);//设置数值
}
3.设置模型数据
标准 QStyledItemDelegete 类在完成编辑时通过发出 closeEditor() 信号来通知视图。该视图可确保关闭并销毁编辑器微件。在此示例中,我们仅提供简单的编辑工具,因此我们不需要发出此信号。
void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QSpinBox *spinbox=static_cast<QSpinBox*>(editor);
spinbox->interpretText();//获取QSpinBOx中最新的数值
int number=spinbox->value();//获取数值
model->setData(index,number,Qt::EditRole);//设置模型数据
}
4.更新编辑器的几何模型
委托负责管理编辑器的几何图形。创建编辑器时,以及更改项目在视图中的大小或位置时,必须设置几何图形。幸运的是,视图在视图选项对象内提供了所有必要的几何信息。
void SpinBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
editor->setGeometry(option.rect);//设置项目矩形
}
使用该控件:
在main.cpp中添加以下头文件:
#include<QAbstractItemModel>
#include<QStringListModel>
#include<QTableView>
#include"spinboxdelegate.h"
并在函数中添加以下代码:
int main(){
QApplication a(argc, argv);
QStringList list;//数据列表
list<<"1"<<"2"<<"3";//添加3个数据
QAbstractItemModel *Mode=new QStringListModel(list);//创建一个模型
QTableView *table=new QTableView;
SpinBoxDelegate *delegate=new SpinBoxDelegate;
table->setItemDelegate(delegate);//设置委托
table->setModel(Mode);//设置模型
table->show();
return a.exec();
}
运行效果为:
你修改数据时,使用QSpinBOx
官方链接为:
模型/视图编程|Qt小部件 5.15.11