• Qt的QItemDelegate使用


    一、介绍

    Qt使用model/view 模式,一般来讲, model是数据,view把数据展示给用户,数据与界面的交互则通过delegagte来执行, 自定义的delegagte都继承于QItemDelegate类。

    QItemDelegate类为模型中的数据项提供了显示和编辑的工具。QItemDelegate可以用来为基于QAbstractItemView子类的项目视图,提供自定义的显示特性和编辑器小控件。

    二、使用

    该类提供了在view中绘制model数据的默认实现。在QAbstractItemDelegate(该类的基类)中,已经定义了paint()和sizeHint()这两个虚函数,为了确保delegate实现自定义的view,我们可以在子类中重新实现这些虚函数,来实现自定义的外观。

    用户实现代理类时,可以从两个类中继承

    第一种:从QAbstractItemDelegate类中继承,至少需要实现两个函数,paint()和sizeHint()

    1. void MyDelegate::paint(QPainter*painter,const QStyleOptionViewItem&option, constQModelIndex&index)const
    2. {
    3. if (index.column() == 需代理的列) {
    4. int content = index.model()->data(index, Qt::DisplayRole).toInt(); // 取到模型中原来的内容
    5. // ... 修改取到的值,代码略 QStyleOptionViewItem myOption = option;
    6. myOption.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; // 处理文本的对齐方式 (不重要)
    7. drawDisplay(painter, myOption, myOption.rect, 修改后的值); // 写回处理后的值
    8. drawFocus(painter, myOption, myOption.rect); // 如果当前项具有焦点,它就绘制一个焦点矩形(不重要)
    9. } else{
    10. QItemDelegate::paint(painter, option, index);
    11. }
    12. }
    13. QSize MyDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
    14. {
    15. if (条件) {
    16. return Qsize(int width, int height); // 用户定义
    17. } else {
    18. return QStyledItemDelegate::sizeHint(option, index);
    19. }
    20. }

    第二种:从QItemDelegate类继承,一般使用这种方式,减少代码量

    1. #ifndef DATEDELEGATE_H
    2. #define DATEDELEGATE_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. class dateDelegate : public QItemDelegate
    9. {
    10. Q_OBJECT
    11. public:
    12. dateDelegate(QObject *parent = 0);
    13. // //创建委托控件
    14. QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
    15. const QModelIndex &index) const;
    16. // 设置控件数据
    17. void setEditorData(QWidget *editor, const QModelIndex &index) const;
    18. // 设置模型数据
    19. void setModelData(QWidget *editor, QAbstractItemModel *model,
    20. const QModelIndex &index) const;
    21. // 设置控件位置
    22. void updateEditorGeometry(QWidget *editor,
    23. const QStyleOptionViewItem &option, const QModelIndex &index) const;
    24. };
    25. #endif // DATEDELEGATE_H

    三、实例

    自定义表格控件,目录如下

    main.cpp

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. int main(int argc, char *argv[])
    11. {
    12. QApplication a(argc, argv);
    13. //The QStandardItemModel class provides a generic model for storing custom data
    14. QStandardItemModel model(4, 4);
    15. QTableView tableView;
    16. tableView.setModel(&model);
    17. dateDelegate datedelegate;
    18. ComboboxDelegate combbDelegate;
    19. SpinBoxDelegate spinDelegate;
    20. tableView.setItemDelegateForColumn(1, &datedelegate);
    21. tableView.setItemDelegateForColumn(2, &combbDelegate);
    22. tableView.setItemDelegateForColumn(3, &spinDelegate);
    23. //View的setItemDelegateForColumn()函数为指定的列应用指定的Delegate
    24. model.setHeaderData(0, Qt::Horizontal, QObject::tr("Name"));
    25. model.setHeaderData(1, Qt::Horizontal, QObject::tr("Birthday"));
    26. model.setHeaderData(2, Qt::Horizontal, QObject::tr("job"));
    27. model.setHeaderData(3, Qt::Horizontal, QObject::tr("Income"));
    28. //为表格的表头显示进行设置
    29. QFile file(":/txt/data.txt");
    30. if (file.open(QFile::ReadOnly))
    31. {
    32. QTextStream stream(&file);
    33. QString line;
    34. int row = 0;
    35. do {
    36. line = stream.readLine();
    37. if (!line.isEmpty())
    38. {
    39. QStringList pieces = line.split(",", QString::SkipEmptyParts);
    40. model.setData(model.index(row, 0, QModelIndex()), pieces.value(0));
    41. model.setData(model.index(row, 1, QModelIndex()), pieces.value(1));
    42. model.setData(model.index(row, 2, QModelIndex()), pieces.value(2));
    43. model.setData(model.index(row, 3, QModelIndex()), pieces.value(3));
    44. row++;
    45. }
    46. } while (!line.isEmpty());
    47. file.close();
    48. }
    49. tableView.setWindowTitle(QObject::tr("Delegate"));
    50. tableView.show();
    51. return a.exec();
    52. }

    spinboxdelegate.h

    1. #ifndef SPINBOXDELEGATE_H
    2. #define SPINBOXDELEGATE_H
    3. #include
    4. #include
    5. class SpinBoxDelegate : public QItemDelegate
    6. {
    7. Q_OBJECT
    8. public:
    9. explicit SpinBoxDelegate(QObject *parent = 0);
    10. QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
    11. const QModelIndex &index) const;
    12. void setEditorData(QWidget *editor, const QModelIndex &index) const;
    13. void setModelData(QWidget *editor, QAbstractItemModel *model,
    14. const QModelIndex &index) const;
    15. void updateEditorGeometry(QWidget *editor,
    16. const QStyleOptionViewItem &option, const QModelIndex &index) const;
    17. };
    18. #endif // SPINBOXDELEGATE_H

     spinboxdelegate.cpp

    1. #include "spinboxdelegate.h"
    2. SpinBoxDelegate::SpinBoxDelegate(QObject *parent) :
    3. QItemDelegate(parent)
    4. {
    5. }
    6. QWidget *SpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,
    7. const QModelIndex &index) const{
    8. QSpinBox * spinbox = new QSpinBox(parent);
    9. spinbox->setRange(1000,10000);
    10. spinbox->installEventFilter(const_cast(this));
    11. return spinbox;
    12. }
    13. //将model中的数据赋值到控件上去
    14. void SpinBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const{
    15. int value = index.model()->data(index).toInt();
    16. QSpinBox * spin = static_cast(editor);
    17. spin->setValue(value);
    18. }
    19. //更新model中的数据
    20. void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
    21. const QModelIndex &index) const{
    22. QSpinBox * spin = static_cast(editor);
    23. int value = spin->value();
    24. model->setData(index,value);
    25. }
    26. void SpinBoxDelegate::updateEditorGeometry(QWidget *editor,
    27. const QStyleOptionViewItem &option, const QModelIndex &index) const{
    28. editor->setGeometry(option.rect);
    29. }

    运行

    代码:

    https://github.com/Jelly-123/QT/tree/master/Delegate

    参考:

    QT-delegate_Lady_gala的博客-CSDN博客_delegate qt

    QtDelegate委托的使用_Mr.攻城狮的博客-CSDN博客_qt委托

  • 相关阅读:
    ptp 时钟同步
    STM32:串口发送/接收HEX数据包代码篇(内含:实物图接线图+代码部分+个人笔记)
    开发者职场“生存状态”大调研报告分析 - 第四版
    前端基础之《Bootstrap(10)—CSS组件_媒体对象、列表组、面板》
    HTML爱心照片墙源码
    Linux 监控网络流量
    AVT Prosilica GC Vision Cameras 相机视觉说明使用安装。具体详情内容可参看PDF目录内容。
    微信、支付宝修改步数【小米运动】
    智慧展览馆:基于AI智能识别技术的视频智慧监管解决方案
    零基础学Python之运算符的使用(手把手带你做牛客网python代码练习题)
  • 原文地址:https://blog.csdn.net/sinat_31608641/article/details/126149650