Qt自定义委托在QTableView中绘制控件、图片、文字
自定义委托,继承于,QStyledItemDelegate类,重载Paint()函数,
1、实现在QTableView中绘制 格式字符串
2、实现在QTableView中绘制进度条
3、实现在QTableView中绘制QCheckBox
4、实现在QTableView中绘制星星
5、实现在QTableView中绘制Pixmap图片


1、实现在QTableView中绘制 格式字符串
- //重载绘制函数
 - void DelReconQueue::paint(QPainter *painter, const QStyleOptionViewItem &option,
 - const QModelIndex &index) const
 - {
 - //如果是第2列'病人Id'
 - if (index.column() == 2)
 - {
 - //获得当前项值
 - int patientId = index.model()->data(index, Qt::DisplayRole).toInt();
 - //设置'病人Id'格式字符串: P:00000x;6位10进制数,不足补0;
 - QString text = QString("P:%1").arg(patientId, 6, 10, QChar('0'));
 - //获取项风格设置
 - QStyleOptionViewItem myOption = option;
 - myOption.displayAlignment = Qt::AlignRight | Qt::AlignVCenter;
 - //绘制文本
 - QApplication::style()->drawItemText ( painter, myOption.rect , myOption.displayAlignment, QApplication::palette(), true,text );
 - }
 - else
 - {
 - //否则调用默认委托
 - QStyledItemDelegate::paint(painter, option, index);
 - }
 - }
 
如果自定义委托继承于QItemDelegate类,绘制字符串,可以直接用QItemDelegate中的drawDisplay();
- void TrackDelegate::paint(QPainter *painter,
 - const QStyleOptionViewItem &option,
 - const QModelIndex &index) const
 - {
 - //保存音轨的列
 - if (index.column() == durationColumn) {
 - //获得索引对应Model中的数据
 - int secs = index.model()->data(index, Qt::DisplayRole).toInt();
 - //设置时间格式字符串 分:秒
 - QString text = QString("%1:%2")
 - .arg(secs / 60, 2, 10, QChar('0'))
 - .arg(secs % 60, 2, 10, QChar('0'));
 - //获取项风格设置
 - QStyleOptionViewItem myOption = option;
 - myOption.displayAlignment = Qt::AlignRight | Qt::AlignVCenter;
 - //绘制文本
 - drawDisplay(painter, myOption, myOption.rect, text);
 - //如果当前有焦点,就绘制一个焦点矩形,否则什么都不做
 - drawFocus(painter, myOption, myOption.rect);
 - } else{
 - //否则默认
 - QItemDelegate::paint(painter, option, index);
 - }
 - }
 
2、实现在QTableView中绘制进度条
- //重载绘制函数
 - void DelReconQueue::paint(QPainter *painter, const QStyleOptionViewItem &option,
 - const QModelIndex &index) const
 - {
 - //如果是'已经完成子任务数'
 - if (index.column() == 9)
 - {
 - const QAbstractItemModel *itemModel = index.model();
 - //获得索引对应Model中的数据
 - int finishedSubTaskNum = itemModel->data(index, Qt::DisplayRole).toInt();
 - int subTaskNum = itemModel->data(itemModel->index(index.row(),8), Qt::DisplayRole).toInt();
 - //进度条的风格选项
 - QStyleOptionProgressBarV2 *progressBarOption = new QStyleOptionProgressBarV2();
 - progressBarOption->rect = option.rect;
 - progressBarOption->minimum = 0;
 - progressBarOption->maximum = subTaskNum;
 - progressBarOption->progress = finishedSubTaskNum;
 - int t = finishedSubTaskNum/subTaskNum;
 - progressBarOption->text = QString::number(t) + "%";
 - progressBarOption->textVisible = true;
 - //绘制进度条
 - QApplication::style()->drawControl(QStyle::CE_ProgressBar, progressBarOption, painter);
 - }
 - else
 - {
 - //否则调用默认委托
 - QStyledItemDelegate::paint(painter, option, index);
 - }
 - }
 
3、实现在QTableView中绘制QCheckBox
- #include <QtGui>
 - #include <QItemDelegate>
 - #include <QStyleOptionProgressBarV2>
 - #include "DelReconQueue.h"
 - //重载绘制函数
 - void DelReconQueue::paint(QPainter *painter, const QStyleOptionViewItem &option,
 - const QModelIndex &index) const
 - {
 - if (index.column() == 11)
 - {
 - //获取值
 - bool checked = index.model()->data(index, Qt::DisplayRole).toBool();
 - //按钮的风格选项
 - QStyleOptionButton *checkBoxOption = new QStyleOptionButton();
 - checkBoxOption->state |= QStyle::State_Enabled;
 - //根据值判断是否选中
 - if(checked)
 - {
 - checkBoxOption->state |= QStyle::State_On;
 - }
 - else
 - {
 - checkBoxOption->state |= QStyle::State_Off;
 - }
 - //返回QCheckBox几何形状
 - checkBoxOption->rect = CheckBoxRect(option);
 - //绘制QCheckBox
 - QApplication::style()->drawControl(QStyle::CE_CheckBox,checkBoxOption,painter);
 - }
 - else
 - {
 - //否则调用默认委托
 - QStyledItemDelegate::paint(painter, option, index);
 - }
 - }
 
//生成QCheckBox
- QRect DgSystemLog::CheckBoxRect(const QStyleOptionViewItem &viewItemStyleOptions)const
 - {
 - //绘制按钮所需要的参数
 - QStyleOptionButton checkBoxStyleOption;
 - //按照给定的风格参数 返回元素子区域
 - QRect checkBoxRect = QApplication::style()->subElementRect( QStyle::SE_CheckBoxIndicator, &checkBoxStyleOption);
 - //返回QCheckBox坐标
 - QPoint checkBoxPoint(viewItemStyleOptions.rect.x() + viewItemStyleOptions.rect.width() / 2 - checkBoxRect.width() / 2,
 - viewItemStyleOptions.rect.y() + viewItemStyleOptions.rect.height() / 2 - checkBoxRect.height() / 2);
 - //返回QCheckBox几何形状
 - return QRect(checkBoxPoint, checkBoxRect.size());
 - }
 
4、实现在QTableView中绘制自定义类 星星
- //重载绘制函数
 - void StarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
 - const QModelIndex &index) const
 - {
 - //如果某项数据是星星类型
 - if (qVariantCanConvert<StarRating>(index.data())) {
 - //获取该项数据,并转换成StarRating类型
 - StarRating starRating = qVariantValue<StarRating>(index.data());
 - //如果有控件被选中,我们就让选中的控件变亮
 - if (option.state & QStyle::State_Selected)
 - painter->fillRect(option.rect, option.palette.highlight());
 - starRating.paint(painter, option.rect, option.palette,
 - StarRating::ReadOnly);
 - }
 - //如果没有控件选中,调用默认委托
 - else {
 - QStyledItemDelegate::paint(painter, option, index);
 - }
 - }
 
星星自定义源文件
- #ifndef STARRATING_H
 - #define STARRATING_H
 - #include <QMetaType>
 - #include <QPointF>
 - #include <QVector>
 - class StarRating
 - {
 - public:
 - enum EditMode { Editable, ReadOnly };
 - StarRating(int starCount = 1, int maxStarCount = 5);
 - void paint(QPainter *painter, const QRect &rect,
 - const QPalette &palette, EditMode mode) const;
 - QSize sizeHint() const;
 - int starCount() const { return myStarCount; }
 - int maxStarCount() const { return myMaxStarCount; }
 - void setStarCount(int starCount) { myStarCount = starCount; }
 - void setMaxStarCount(int maxStarCount) { myMaxStarCount = maxStarCount; }
 - private:
 - QPolygonF starPolygon;
 - QPolygonF diamondPolygon;
 - int myStarCount;
 - int myMaxStarCount;
 - };
 - //让所有模板类型都知道该类,包括QVariant
 - Q_DECLARE_METATYPE(StarRating)
 - #endif
 - #include <QtGui>
 - #include <math.h>
 - #include "starrating.h"
 - const int PaintingScaleFactor = 20;
 - StarRating::StarRating(int starCount, int maxStarCount)
 - {
 - myStarCount = starCount;
 - myMaxStarCount = maxStarCount;
 - starPolygon << QPointF(1.0, 0.5);
 - for (int i = 1; i < 5; ++i)
 - starPolygon << QPointF(0.5 + 0.5 * cos(0.8 * i * 3.14),
 - 0.5 + 0.5 * sin(0.8 * i * 3.14));
 - diamondPolygon << QPointF(0.4, 0.5) << QPointF(0.5, 0.4)
 - << QPointF(0.6, 0.5) << QPointF(0.5, 0.6)
 - << QPointF(0.4, 0.5);
 - }
 - QSize StarRating::sizeHint() const
 - {
 - return PaintingScaleFactor * QSize(myMaxStarCount, 1);
 - }
 - void StarRating::paint(QPainter *painter, const QRect &rect,
 - const QPalette &palette, EditMode mode) const
 - {
 - painter->save();
 - painter->setRenderHint(QPainter::Antialiasing, true);
 - painter->setPen(Qt::NoPen);
 - if (mode == Editable) {
 - painter->setBrush(palette.highlight());
 - } else {
 - painter->setBrush(palette.foreground());
 - }
 - int yOffset = (rect.height() - PaintingScaleFactor) / 2;
 - painter->translate(rect.x(), rect.y() + yOffset);
 - //画笔坐标
 - painter->scale(PaintingScaleFactor, PaintingScaleFactor);
 - for (int i = 0; i < myMaxStarCount; ++i) {
 - if (i < myStarCount) {
 - painter->drawPolygon(starPolygon, Qt::WindingFill);
 - } else if (mode == Editable) {
 - painter->drawPolygon(diamondPolygon, Qt::WindingFill);
 - }
 - painter->translate(1.0, 0.0);
 - }
 - painter->restore();
 - }
 
5、实现在QTableView中绘制Pixmap图片 ,
详细请看具体例子 Qt-在表格(QTableView)中插入图片
- void MyItemDelegate::paint(QPainter * painter,
 - const QStyleOptionViewItem & option,
 - const QModelIndex & index) const
 - {
 - if(index.column()!=0){
 - QItemDelegate::paint(painter,option,index);
 - return;
 - }
 - const QAbstractItemModel * model=index.model();
 - QVariant var=model->data(index,Qt::CheckStateRole);
 - if(var.isNull()) var=false;
 - const QPixmap & star=var.toBool()?
 - favouritePixmap:notFavouritePixmap;
 - int width=star.width();
 - int height=star.height();
 - QRect rect=option.rect;
 - int x=rect.x()+rect.width()/2-width/2;
 - int y=rect.y()+rect.height()/2-height/2;
 - painter->drawPixmap(x,y,star);
 - }
 
Qt自定义委托在QTableView中绘制控件、图片、文字的更多相关文章
- Qt自定义委托在QTableView中绘制控件、图片、文字(内容比较全)
		
自定义委托,继承于,QStyledItemDelegate类,重载Paint()函数, 1.实现在QTableView中绘制 格式字符串 2.实现在QTableView中绘制进度条 3.实现在QTab ...
 - Qt自定义阴影效果和QOpenGLWidget冲突导致控件不刷新
		
Qt5.6.2版本存在这样一个问题(其它版本未测试),当main函数中设置了application.setAttribute(Qt::AA_NativeWindows)(用于使得每个子界面都可以获取w ...
 - Winform中Picture控件图片的拖拽显示
		
注解:最近做了一个小工具,在Winform中对Picture控件有一个需求,可以通过鼠标从外部拖拽图片到控件的上,释放鼠标,显示图片! 首先你需要对你的整个Fom窗口的AllowDrop设置Ture ...
 - 在Paint事件中绘制控件(边框)
		
单纯的自己记录,将来会继续添加,侥幸被大家发现了的话请不要太鄙视... private void panel4_Paint(object sender, PaintEventArgs e) { Con ...
 - paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制
		
源地址:http://blog.csdn.net/attilax/article/details/12343625 paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制 效果图: ...
 - 在WinForm中使用委托来在其他线程中改变控件的显示
		
假设winform中有两个控件: 1.ListView用来显示进度的文本提示,ID:listView_progressInfo 2.ProgressBar用来显示进度,ID:progressBar1 ...
 - Qt在表格中加入控件
		
任务:使用QTableWidget动态生成表格,在每行的某两列中加入QComboBox下拉框控件和QPushButton按钮控件 有添加,删除,编辑功能,每行的按钮可以浏览文件夹并选择文件 1.新建一 ...
 - WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探
		
原文:WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探 最近因为项目需要,开始学习如何使用WPF开发桌面程序.使用WPF一段时间之后,感 ...
 - Kotlin 第一弹:自定义 ViewGroup 实现流式标签控件
		
古人学问无遗力, 少壮工夫老始成.纸上得来终觉浅, 绝知此事要躬行. – 陆游 <冬夜读书示子聿> 上周 Google I/O 大会的召开,宣布了 Kotlin 语言正式成为了官方开发语言 ...
 
随机推荐
- stm32 i2c eeprom 24C02
			
电路图 相关文章:http://blog.csdn.net/zhangxuechao_/article/details/74936798 举例 #define i2c_scl PBout(10) #d ...
 - 在网页中添加google搜索
			
网页中插入谷歌搜索,至于怎么上谷歌,后面有时间会更,推荐百度 <form method="GET" action="http://www.google.com.hk ...
 - B+树Java代码实现以及测试
			
M阶B+树的定义: 任意非叶子结点最多有M个子节点:且M>2: 除根结点以外的非叶子结点至少有 M/2个子节点: 根结点至少有2个子节点: 除根节点外每个结点存放至少M/2和至多M个关键字:(至 ...
 - JavaScript程序块初始练习
			
由语句语句块,函数,对象,方法,属性构成.通过顺序,分支,循环三种基本程序控制结构来进行编程. 来一段小代码: <!DOCTYPE html> <html> <head& ...
 - Metasploit Penetration (第一夜加班)
			
1.最近白天瞒着上班,晚自习看英语,还要瞒着写论文(现在是看,之前的部分章节被老师否定了,现在开始要从新进行整理)所以只有这晚上来开始看我的渗透测试了,发现渗透的很多知识,只要你平时不用很快就会生疏, ...
 - vs2010 glfw  glew glad glm 配置
			
OpenGL: Configuring GLFW and GLEW in Visual C++ Express Posted by Dimitri | Aug 14th, 2013 | Filed u ...
 - net.exe和net1.exe的区别&联系.
			
system32文件夹下有一个net.exe和net1.exe,一般做渗透的时候,很多情况下管理员只知道删除net.exe而遗漏net1.exe,导致我们能继续do evil..... 一直没弄明白它 ...
 - 使用fiddler进行接口测试
			
我们来说说如何使用fiddler做接口测试? 测试准备,抓到相应的接口和入参或者找接口文档,我这里就用聚合数据里面的接口做样例, 接口如下: 测试接口:http://japi.juhe.cn/qqev ...
 - 一个基于TCP/IP的小项目,实现广播消息的功能。(超详细版)
			
1.结合现状 功能分析 该功能基于上个项目的改进,主要是通过对服务器端代码的修改,以及对客户端作少许修改,实现开启多客户端时,一个客户端发送消息,达到对所有客户端广播的效果.可参考网吧里的点歌系统,比 ...
 - 1113  form表单与css选择器
			
目录 1.form表单 form元素 特点 参数 form元素内的控件 1.input的使用 2.select标签 3.textarea元素 4.autofocus属性 2.CSS 1.基础语法 cs ...