自定义委托类

setItemDelegete();该函数可以自定义委托类

该例子为Qt官网的一个例子:使用QSpinBox来提供编辑功能

  1. 首先创建一个项目:名为object
  2. 在项目中添加一个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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值