当前位置: 首页 > news >正文

QT系列教程(19) Qt MVC结构之QItemDelegate介绍

QItemDelegate

当我们想重新实现一个代理时,可以子类化QItemDelegate。实现item编辑时特定的效果,比如在item编辑时我们设置一个QSpinBox返回。
创建一个QApplication项目,然后我们新增一个类,类名叫做spinboxdelegate。

class SpinBoxDelegate : public QItemDelegate
{
     Q_OBJECT
public:
    explicit SpinBoxDelegate(QObject * parent=0);
    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;
};

SpinBoxDelegate类中声明了几个函数,这些函数在QItemDelegate继承而来,通过重写实现我们自己定义的代理功能。
createEditor函数是在item被双击后进入编辑状态时触发的,返回一个QWidget控件用来管理编辑。
setModelData是在item被修改后触发的,将改动的内容写入model中。
setEditorData是在item被双击进入编辑状态时,将model的内容写入editor中。
updateEditorGeometry是刷新editor的矩形区域,因为随着item变大或者拉伸,它的区域也要随之刷新。

具体实现

1 创建editor, 返回一个spinbox

QWidget * SpinBoxDelegate::createEditor(QWidget* parent,   const QStyleOptionViewItem &option,
                                        const QModelIndex &index) const{
    QSpinBox * editor = new QSpinBox(parent);
    editor->setMinimum(0);
    editor->setMaximum(100);
    return editor;
}

2 在编辑状态时,将model的数据写入editor

void SpinBoxDelegate::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);
}

3 编辑完成时将editor的内容写入model

void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const {
    QSpinBox * spinBox = static_cast<QSpinBox*>(editor);
    spinBox->interpretText();
    int value = spinBox->value();
    model->setData(index, value, Qt::EditRole);
}

4 刷新矩形区域

void SpinBoxDelegate::updateEditorGeometry(QWidget *editor,
                          const QStyleOptionViewItem &option,
                          const QModelIndex &index) const {
    editor->setGeometry(option.rect);
}

接下来我们在MainWindow的构造函数里创建两个model和view,我们对其中的一个view使用我们自定义的delegate

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QStandardItemModel * model = new QStandardItemModel(7,4,this);
    for(int row=0; row < 7; row++){
        for(int column = 0; column < 4; column++){
            QStandardItem * item = new QStandardItem(QString("%1").arg(row*4+column));
            model->setItem(row, column, item);
        }
    }

   QTableView* _table_view = new QTableView;
    _table_view->setModel(model);
    setCentralWidget(_table_view);
    this->resize(800,800);

    QTableView* _table_view2 = new QTableView;
    SpinBoxDelegate * delegate = new SpinBoxDelegate(this);
    QStandardItemModel * model2 = new QStandardItemModel(7,4,this);
    for(int row=0; row < 7; row++){
        for(int column = 0; column < 4; column++){
            QStandardItem * item = new QStandardItem(QString("%1").arg(row*4+column));
            model2->setItem(row, column, item);
        }
    }
     _table_view2->setModel(model2);
     _table_view2->setItemDelegate(delegate);
     _table_view2->show();
     _table_view2->resize(800,800);
}

运行程序后,双击两个view的item,可以看到效果的不同
https://cdn.llfc.club/1671606628462.jpg

源码链接

源码链接
https://gitee.com/secondtonone1/qt-learning-notes

相关文章:

  • FSC森林认证:推动全球森林的可持续管理
  • 记录一个SQL自动执行的html页面
  • 最短路算法
  • 【微知】tmux中如何让某个窗口或者子窗口显示时间(ctrl + b t)
  • 【Linux学习笔记】Linux用户和文件权限的深度剖析
  • [HUBUCTF 2022 新生赛]messy_traffic
  • JAVA中的多线程安全问题及解决方案
  • kafka连问
  • 掌握xtquant:高效获取市场基础信息的实战指南
  • js数组常用方法与技巧
  • 累计完工数量达到了xxxx超过了最大可完工数量xxxx
  • C++ 邻接矩阵(代码)
  • 【微知】plantuml在泳道图中如何将几个步骤放入一个框中?(group “sub框1“; end !! “sub框1“)
  • 5-24 色彩与风格——T2IA自适应
  • 【医院绩效管理专题】8.医院绩效数据的收集与整理方法:洞察现状,引领未来
  • 使用DeepSeek进行知识降维输出
  • 手动实现一个RTTI系统
  • 【AIGC】OpenAI 集成 Langchain 操作实战使用详解
  • 2025探索短剧行业新可能报告40+份汇总解读|附PDF下载
  • OpenManus代码详解(一):app/agent
  • 成品网站w灬 源码1688三叶草/百度引流推广怎么收费
  • 法院建设门户网站情况/爱站网官网
  • 创造一个app要多少钱/seo网站技术培训
  • 卡片式网站模板下载/靠谱的代写平台
  • 成都网站建设排名/全媒体广告代理加盟靠谱吗
  • 导航网站 wordpress/看广告赚钱的平台