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

Qt中的Model与View5: QStyledItemDelegate

目录

QStyledItemDelegate API

重载公共函数

保护函数

重载保护函数


当在 Qt 项目视图中显示模型数据时,例如 QTableView,每个项目由代理绘制。此外,当项目被编辑时,提供一个编辑器小部件,该小部件在编辑时显示在项目视图上。QStyledItemDelegate 是所有 Qt 项目视图的默认代理,并在创建时自动安装。

QStyledItemDelegate 类是模型/视图框架的一部分,允许独立于模型和视图开发项目的显示和编辑。项目数据被分配给 ItemDataRole;每个项目可以为每个角色存储一个 QVariantQStyledItemDelegate 实现了对用户期望的最常见数据类型的显示和编辑,包括布尔值、整数和字符串。

数据将根据其在模型中的角色以不同的方式绘制。下表描述了角色及其可处理的数据类型。

角色可接受类型
Qt::BackgroundRoleQBrush
Qt::CheckStateRoleQt::CheckState
Qt::DecorationRoleQIcon, QPixmap, QImageQColor
Qt::DisplayRoleQString 和具有字符串表示的类型
Qt::EditRole参见 QItemEditorFactory 的详细信息
Qt::FontRoleQFont
Qt::SizeHintRoleQSize
Qt::TextAlignmentRoleQt::Alignment
Qt::ForegroundRoleQBrush

编辑器通过 QItemEditorFactory 创建;QItemEditorFactory 提供一个默认的静态实例,安装在所有项目代理上。你可以使用 setItemEditorFactory() 设置自定义工厂,或者通过 QItemEditorFactory::setDefaultFactory() 设置新的默认工厂。

如果代理不支持你所需的数据类型的绘制,或者你想自定义项目的绘制,需要继承 QStyledItemDelegate,并重新实现 paint() 和可能的 sizeHint()paint() 函数对每个项目单独调用,使用 sizeHint() 可以为每个项目指定提示。绘制复选框指示符的工作由当前样式执行。样式还指定了绘制不同数据角色的数据的大小和边界矩形。当绘制已支持的数据类型时,向样式请求这些边界矩形通常是个好主意。

如果你希望更改样式计算的边界矩形或复选框指示符的绘制,可以继承 QStyle

QStyledItemDelegate API

API 签名说明
QStyledItemDelegate(QObject *parent = nullptr)构造函数,创建一个 QStyledItemDelegate 对象,父对象为可选。
virtual ~QStyledItemDelegate()虚析构函数,释放 QStyledItemDelegate 对象。
virtual QString displayText(const QVariant &value, const QLocale &locale) const返回根据提供的值和区域设置格式化的文本,用于显示在视图中。
QItemEditorFactory *itemEditorFactory() const返回当前使用的编辑器工厂。
void setItemEditorFactory(QItemEditorFactory *factory)设置自定义的编辑器工厂。
重载公共函数
API 签名说明
virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override创建用于编辑数据的自定义编辑器。
virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override绘制视图中每个项目的外观。
virtual void setEditorData(QWidget *editor, const QModelIndex &index) const override为编辑器设置数据。
virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override从编辑器获取数据并更新模型。
virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override返回项目的建议大小。
virtual void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override更新编辑器的几何形状,使其正确显示。
保护函数
API 签名说明
virtual void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const初始化样式选项,用于绘制项目。
重载保护函数
API 签名说明
virtual bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) override处理编辑器事件。
virtual bool eventFilter(QObject *editor, QEvent *event) override过滤编辑器的事件。

举个例子:

class TSpinBoxDelegate : public QStyledItemDelegate
{
    Q_OBJECT
​
public:
    explicit TSpinBoxDelegate(QObject *parent = nullptr);
​
​
    //自定义代理必须重新实现以下4个函数
​
    //创建编辑组件
    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;
​
};
#include "tspinboxdelegate.h"
​
#include    <QSpinBox>
​
TSpinBoxDelegate::TSpinBoxDelegate(QObject *parent): QStyledItemDelegate(parent)
{
​
}
​
QWidget *TSpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                                        const QModelIndex &index) const
{ //创建代理编辑组件
    Q_UNUSED(option);
    Q_UNUSED(index);
​
    QSpinBox *editor = new QSpinBox(parent); //创建一个QSpinBox
    editor->setFrame(false); //设置为无边框
    editor->setMinimum(0);
    editor->setMaximum(50000);
​
    return editor;  //返回此编辑器
}
​
//从数据模型获取数据,显示到代理组件中
void TSpinBoxDelegate::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);   //设置编辑器的数值
}
​
//将代理组件的数据,保存到数据模型中
void TSpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                    const QModelIndex &index) const
{
    QSpinBox *spinBox = static_cast<QSpinBox*>(editor);     //强制类型转换
//    spinBox->interpretText();       //解释数据,如果数据被修改后,就触发信号
    int value = spinBox->value();   //获取spinBox的值
    model->setData(index, value, Qt::EditRole);     //更新到数据模型
}
​
​
//设置组件大小
void TSpinBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
                                            const QModelIndex &index) const
{
    Q_UNUSED(index);
    editor->setGeometry(option.rect);
}

在主窗口中

    intSpinDelegate= new TSpinBoxDelegate(this);
    ui->tableView->setItemDelegateForColumn(0, intSpinDelegate);    //测深
​
    floatSpinDelegate = new TFloatSpinDelegate(this);
    ui->tableView->setItemDelegateForColumn(1, floatSpinDelegate);  //垂深
    ui->tableView->setItemDelegateForColumn(2, floatSpinDelegate);  //方位
    ui->tableView->setItemDelegateForColumn(3, floatSpinDelegate);  //总位移

然后在外面编辑的时候:

就会弹出来这个了!


http://www.kler.cn/a/380424.html

相关文章:

  • 宝塔-firefox(Docker应用)-构建自己的Web浏览器
  • Docker部署GitLab服务器
  • jumpserver docker安装
  • 如何高效学习PHP框架源码
  • FPGA的DMA应用——pcileech
  • 华为管理变革之道:奋斗文化与活力
  • 【含文档+源码】基于SpringBoot+Vue的新型吃住玩一体化旅游管理系统的设计与实现
  • 【格式化查看JSON文件】coco的json文件内容都在一行如何按照json格式查看
  • Hadoop生态系统主要包括哪些组件以及它们的作用
  • 探索 MarsCode:代码练习-AI助你提升编码/算法能力
  • OpenCV图像基础
  • 红队知识学习入门(3)Shodan使用6
  • 算法:图的相关算法
  • CMFCMaskedEdit 类和CIPAddressCtrl 类
  • 论负载均衡技术在Web系统中的应用论文
  • JMeter与大模型融合应用之jmeter.properties配置文件新增配置
  • Rust 力扣 - 1493. 删掉一个元素以后全为 1 的最长子数组
  • 基于卷积神经网络的水稻叶片病害识别系统(pytorch框架,python源码)
  • Typora在ubuntu上通过Picgo-core来进行Github图床上传(超详细)
  • 介绍目标检测中mAP50和mAP50-95的区别
  • SQL CASE表达式与窗口函数
  • Unity 中winform端转webGL异常处理
  • 100种算法【Python版】第43篇——优化算法之模拟退火算法
  • OpenCV视觉分析之目标跟踪(9)计算扩展相关系数computeECC()的使用
  • 【C语言】C程序的编译+链接
  • 机场电子采购信息系统