当前位置:网站首页>Qt的QItemDelegate使用
Qt的QItemDelegate使用
2022-08-04 14:11:00 【物随心转】
一、介绍
Qt使用model/view 模式,一般来讲, model是数据,view把数据展示给用户,数据与界面的交互则通过delegagte来执行, 自定义的delegagte都继承于QItemDelegate类。
QItemDelegate类为模型中的数据项提供了显示和编辑的工具。QItemDelegate可以用来为基于QAbstractItemView子类的项目视图,提供自定义的显示特性和编辑器小控件。
二、使用
该类提供了在view中绘制model数据的默认实现。在QAbstractItemDelegate(该类的基类)中,已经定义了paint()和sizeHint()这两个虚函数,为了确保delegate实现自定义的view,我们可以在子类中重新实现这些虚函数,来实现自定义的外观。
用户实现代理类时,可以从两个类中继承
第一种:从QAbstractItemDelegate类中继承,至少需要实现两个函数,paint()和sizeHint()
void MyDelegate::paint(QPainter*painter,const QStyleOptionViewItem&option, constQModelIndex&index)const
{
if (index.column() == 需代理的列) {
int content = index.model()->data(index, Qt::DisplayRole).toInt(); // 取到模型中原来的内容
// ... 修改取到的值,代码略 QStyleOptionViewItem myOption = option;
myOption.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; // 处理文本的对齐方式 (不重要)
drawDisplay(painter, myOption, myOption.rect, 修改后的值); // 写回处理后的值
drawFocus(painter, myOption, myOption.rect); // 如果当前项具有焦点,它就绘制一个焦点矩形(不重要)
} else{
QItemDelegate::paint(painter, option, index);
}
}
QSize MyDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if (条件) {
return Qsize(int width, int height); // 用户定义
} else {
return QStyledItemDelegate::sizeHint(option, index);
}
}
第二种:从QItemDelegate类继承,一般使用这种方式,减少代码量
#ifndef DATEDELEGATE_H
#define DATEDELEGATE_H
#include <QtGui>
#include<QItemDelegate>
#include<QDateTimeEdit>
#include<QDebug>
#include<QModelIndex>
class dateDelegate : public QItemDelegate
{
Q_OBJECT
public:
dateDelegate(QObject *parent = 0);
// //创建委托控件
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;
};
#endif // DATEDELEGATE_H
三、实例
自定义表格控件,目录如下
main.cpp
#include <QApplication>
#include<QStandardItemModel>
#include<QTableView>
#include<datedelegate.h>
#include<comboboxdelegate.h>
#include<spinboxdelegate.h>
#include<QFile>
#include<QTextStream>
#include<QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//The QStandardItemModel class provides a generic model for storing custom data
QStandardItemModel model(4, 4);
QTableView tableView;
tableView.setModel(&model);
dateDelegate datedelegate;
ComboboxDelegate combbDelegate;
SpinBoxDelegate spinDelegate;
tableView.setItemDelegateForColumn(1, &datedelegate);
tableView.setItemDelegateForColumn(2, &combbDelegate);
tableView.setItemDelegateForColumn(3, &spinDelegate);
//View的setItemDelegateForColumn()函数为指定的列应用指定的Delegate
model.setHeaderData(0, Qt::Horizontal, QObject::tr("Name"));
model.setHeaderData(1, Qt::Horizontal, QObject::tr("Birthday"));
model.setHeaderData(2, Qt::Horizontal, QObject::tr("job"));
model.setHeaderData(3, Qt::Horizontal, QObject::tr("Income"));
//为表格的表头显示进行设置
QFile file(":/txt/data.txt");
if (file.open(QFile::ReadOnly))
{
QTextStream stream(&file);
QString line;
int row = 0;
do {
line = stream.readLine();
if (!line.isEmpty())
{
QStringList pieces = line.split(",", QString::SkipEmptyParts);
model.setData(model.index(row, 0, QModelIndex()), pieces.value(0));
model.setData(model.index(row, 1, QModelIndex()), pieces.value(1));
model.setData(model.index(row, 2, QModelIndex()), pieces.value(2));
model.setData(model.index(row, 3, QModelIndex()), pieces.value(3));
row++;
}
} while (!line.isEmpty());
file.close();
}
tableView.setWindowTitle(QObject::tr("Delegate"));
tableView.show();
return a.exec();
}
spinboxdelegate.h
#ifndef SPINBOXDELEGATE_H
#define SPINBOXDELEGATE_H
#include <QItemDelegate>
#include<QSpinBox>
class SpinBoxDelegate : public QItemDelegate
{
Q_OBJECT
public:
explicit SpinBoxDelegate(QObject *parent = 0);
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;
};
#endif // SPINBOXDELEGATE_H
spinboxdelegate.cpp
#include "spinboxdelegate.h"
SpinBoxDelegate::SpinBoxDelegate(QObject *parent) :
QItemDelegate(parent)
{
}
QWidget *SpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,
const QModelIndex &index) const{
QSpinBox * spinbox = new QSpinBox(parent);
spinbox->setRange(1000,10000);
spinbox->installEventFilter(const_cast<SpinBoxDelegate*>(this));
return spinbox;
}
//将model中的数据赋值到控件上去
void SpinBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const{
int value = index.model()->data(index).toInt();
QSpinBox * spin = static_cast<QSpinBox *>(editor);
spin->setValue(value);
}
//更新model中的数据
void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const{
QSpinBox * spin = static_cast<QSpinBox *>(editor);
int value = spin->value();
model->setData(index,value);
}
void SpinBoxDelegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &index) const{
editor->setGeometry(option.rect);
}
运行
代码:
https://github.com/Jelly-123/QT/tree/master/Delegate
参考:
边栏推荐
- 七夕邂逅爱,那人一定在
- C# 动态加载卸载 DLL
- 如何通过使用“缓存”相关技术,解决“高并发”的业务场景案例?
- Unity插件:使用PopulationSystem制作行走交流的路人
- Map常见的遍历方式-keySet 和 entrySet
- The Internet of things application development trend
- 节省50%成本!京东云重磅发布新一代混合CDN产品
- 量化细胞内的信息流:机器学习时代下的研究进展
- 四平方和,激光炸弹
- LeetCode 1403 Minimum subsequence in non-increasing order [greedy] HERODING's LeetCode road
猜你喜欢
How to find the location of a pdf file in endnote literature
Redis 复习计划 - Redis主从数据一致性和哨兵机制
阿里老鸟终于把测试用例怎么写说的明明白白了,小鸟必看
c#之winform(软件开发)
智能电视可以打开小程序应用,再也不用头痛内存了
How to play the Tower of Hanoi
AutoCAD DWG,DXF文件导出高清图片、PDF
解题-->在线OJ(十八)
Analysis and application of portrait segmentation technology
Fuse bit of AVR study notes
随机推荐
idea去掉spark的日志
将 Sentinel 熔断限流规则持久化到 Nacos 配置中心
Lixia Action | Kyushu Yunzhang Jinnan: Open source is not a movement for a few people, popularization is the source
【HMS core】【Media】【视频编辑服务】 在线素材无法展示,一直Loading状态或是网络异常
BZOJ 1798 维护序列 (多校连萌,对线段树进行加乘混合操作)
【问题解决】QT更新组件出现 “要继续此操作,至少需要一个有效且已启用的储存库”
九州云出席领航者线上论坛,共话5G MEC边缘计算现状、挑战和未来
华为手机切换屏幕效果_华为p40页面切换效果怎么换
开放麒麟 openKylin 版本规划敲定:10 月发布 0.9 版并开启公测,12 月发布 1.0 版
MySQL【触发器】
Install mysql on k8s
leetcode 48. Rotate Image (Medium)
c#之winform(软件开发)
人像分割技术解析与应用
ICML 2022 | 图神经网络的局部增强
两款移相振荡器的对比
Week 7 Latent Variable Models and Expectation Maximization
如何才能有效、高效阅读?猿辅导建议“因材因时施教”
【毕设选题推荐】机器人工程专业毕设选题推荐
没有Project Facets的解决方法