自定义委托,继承于,QStyledItemDelegate类,重载Paint()函数,

1、实现在QTableView中绘制 格式字符串

2、实现在QTableView中绘制进度条

3、实现在QTableView中绘制QCheckBox

4、实现在QTableView中绘制星星

5、实现在QTableView中绘制Pixmap图片

1、实现在QTableView中绘制 格式字符串

  1. //重载绘制函数
  2. void DelReconQueue::paint(QPainter *painter, const QStyleOptionViewItem &option,
  3. const QModelIndex &index) const
  4. {
  5. //如果是第2列'病人Id'
  6. if (index.column() == 2)
  7. {
  8. //获得当前项值
  9. int patientId = index.model()->data(index, Qt::DisplayRole).toInt();
  10. //设置'病人Id'格式字符串: P:00000x;6位10进制数,不足补0;
  11. QString text = QString("P:%1").arg(patientId, 6, 10, QChar('0'));
  12. //获取项风格设置
  13. QStyleOptionViewItem myOption = option;
  14. myOption.displayAlignment = Qt::AlignRight | Qt::AlignVCenter;
  15. //绘制文本
  16. QApplication::style()->drawItemText ( painter, myOption.rect , myOption.displayAlignment, QApplication::palette(), true,text );
  17. }
  18. else
  19. {
  20. //否则调用默认委托
  21. QStyledItemDelegate::paint(painter, option, index);
  22. }
  23. }

   如果自定义委托继承于QItemDelegate类,绘制字符串,可以直接用QItemDelegate中的drawDisplay();

  1. void TrackDelegate::paint(QPainter *painter,
  2. const QStyleOptionViewItem &option,
  3. const QModelIndex &index) const
  4. {
  5. //保存音轨的列
  6. if (index.column() == durationColumn) {
  7. //获得索引对应Model中的数据
  8. int secs = index.model()->data(index, Qt::DisplayRole).toInt();
  9. //设置时间格式字符串 分:秒
  10. QString text = QString("%1:%2")
  11. .arg(secs / 60, 2, 10, QChar('0'))
  12. .arg(secs % 60, 2, 10, QChar('0'));
  13. //获取项风格设置
  14. QStyleOptionViewItem myOption = option;
  15. myOption.displayAlignment = Qt::AlignRight | Qt::AlignVCenter;
  16. //绘制文本
  17. drawDisplay(painter, myOption, myOption.rect, text);
  18. //如果当前有焦点,就绘制一个焦点矩形,否则什么都不做
  19. drawFocus(painter, myOption, myOption.rect);
  20. } else{
  21. //否则默认
  22. QItemDelegate::paint(painter, option, index);
  23. }
  24. }

2、实现在QTableView中绘制进度条

  1. //重载绘制函数
  2. void DelReconQueue::paint(QPainter *painter, const QStyleOptionViewItem &option,
  3. const QModelIndex &index) const
  4. {
  5. //如果是'已经完成子任务数'
  6. if (index.column() == 9)
  7. {
  8. const QAbstractItemModel *itemModel = index.model();
  9. //获得索引对应Model中的数据
  10. int finishedSubTaskNum = itemModel->data(index, Qt::DisplayRole).toInt();
  11. int subTaskNum = itemModel->data(itemModel->index(index.row(),8), Qt::DisplayRole).toInt();
  12. //进度条的风格选项
  13. QStyleOptionProgressBarV2 *progressBarOption = new QStyleOptionProgressBarV2();
  14. progressBarOption->rect = option.rect;
  15. progressBarOption->minimum = 0;
  16. progressBarOption->maximum = subTaskNum;
  17. progressBarOption->progress = finishedSubTaskNum;
  18. int t = finishedSubTaskNum/subTaskNum;
  19. progressBarOption->text = QString::number(t) + "%";
  20. progressBarOption->textVisible = true;
  21. //绘制进度条
  22. QApplication::style()->drawControl(QStyle::CE_ProgressBar, progressBarOption, painter);
  23. }
  24. else
  25. {
  26. //否则调用默认委托
  27. QStyledItemDelegate::paint(painter, option, index);
  28. }
  29. }

  3、实现在QTableView中绘制QCheckBox

  1. #include <QtGui>
  2. #include <QItemDelegate>
  3. #include <QStyleOptionProgressBarV2>
  4. #include "DelReconQueue.h"
  5. //重载绘制函数
  6. void DelReconQueue::paint(QPainter *painter, const QStyleOptionViewItem &option,
  7. const QModelIndex &index) const
  8. {
  9. if (index.column() == 11)
  10. {
  11. //获取值
  12. bool checked = index.model()->data(index, Qt::DisplayRole).toBool();
  13. //按钮的风格选项
  14. QStyleOptionButton *checkBoxOption = new QStyleOptionButton();
  15. checkBoxOption->state |= QStyle::State_Enabled;
  16. //根据值判断是否选中
  17. if(checked)
  18. {
  19. checkBoxOption->state |= QStyle::State_On;
  20. }
  21. else
  22. {
  23. checkBoxOption->state |= QStyle::State_Off;
  24. }
  25. //返回QCheckBox几何形状
  26. checkBoxOption->rect = CheckBoxRect(option);
  27. //绘制QCheckBox
  28. QApplication::style()->drawControl(QStyle::CE_CheckBox,checkBoxOption,painter);
  29. }
  30. else
  31. {
  32. //否则调用默认委托
  33. QStyledItemDelegate::paint(painter, option, index);
  34. }
  35. }

//生成QCheckBox

  1. QRect DgSystemLog::CheckBoxRect(const QStyleOptionViewItem &viewItemStyleOptions)const
  2. {
  3. //绘制按钮所需要的参数
  4. QStyleOptionButton checkBoxStyleOption;
  5. //按照给定的风格参数 返回元素子区域
  6. QRect checkBoxRect = QApplication::style()->subElementRect( QStyle::SE_CheckBoxIndicator, &checkBoxStyleOption);
  7. //返回QCheckBox坐标
  8. QPoint checkBoxPoint(viewItemStyleOptions.rect.x() + viewItemStyleOptions.rect.width() / 2 - checkBoxRect.width() / 2,
  9. viewItemStyleOptions.rect.y() + viewItemStyleOptions.rect.height() / 2 - checkBoxRect.height() / 2);
  10. //返回QCheckBox几何形状
  11. return QRect(checkBoxPoint, checkBoxRect.size());
  12. }

4、实现在QTableView中绘制自定义类 星星

  1. //重载绘制函数
  2. void StarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
  3. const QModelIndex &index) const
  4. {
  5. //如果某项数据是星星类型
  6. if (qVariantCanConvert<StarRating>(index.data())) {
  7. //获取该项数据,并转换成StarRating类型
  8. StarRating starRating = qVariantValue<StarRating>(index.data());
  9. //如果有控件被选中,我们就让选中的控件变亮
  10. if (option.state & QStyle::State_Selected)
  11. painter->fillRect(option.rect, option.palette.highlight());
  12. starRating.paint(painter, option.rect, option.palette,
  13. StarRating::ReadOnly);
  14. }
  15. //如果没有控件选中,调用默认委托
  16. else {
  17. QStyledItemDelegate::paint(painter, option, index);
  18. }
  19. }

星星自定义源文件

  1. #ifndef STARRATING_H
  2. #define STARRATING_H
  3. #include <QMetaType>
  4. #include <QPointF>
  5. #include <QVector>
  6. class StarRating
  7. {
  8. public:
  9. enum EditMode { Editable, ReadOnly };
  10. StarRating(int starCount = 1, int maxStarCount = 5);
  11. void paint(QPainter *painter, const QRect &rect,
  12. const QPalette &palette, EditMode mode) const;
  13. QSize sizeHint() const;
  14. int starCount() const { return myStarCount; }
  15. int maxStarCount() const { return myMaxStarCount; }
  16. void setStarCount(int starCount) { myStarCount = starCount; }
  17. void setMaxStarCount(int maxStarCount) { myMaxStarCount = maxStarCount; }
  18. private:
  19. QPolygonF starPolygon;
  20. QPolygonF diamondPolygon;
  21. int myStarCount;
  22. int myMaxStarCount;
  23. };
  24. //让所有模板类型都知道该类,包括QVariant
  25. Q_DECLARE_METATYPE(StarRating)
  26. #endif
  27. #include <QtGui>
  28. #include <math.h>
  29. #include "starrating.h"
  30. const int PaintingScaleFactor = 20;
  31. StarRating::StarRating(int starCount, int maxStarCount)
  32. {
  33. myStarCount = starCount;
  34. myMaxStarCount = maxStarCount;
  35. starPolygon << QPointF(1.0, 0.5);
  36. for (int i = 1; i < 5; ++i)
  37. starPolygon << QPointF(0.5 + 0.5 * cos(0.8 * i * 3.14),
  38. 0.5 + 0.5 * sin(0.8 * i * 3.14));
  39. diamondPolygon << QPointF(0.4, 0.5) << QPointF(0.5, 0.4)
  40. << QPointF(0.6, 0.5) << QPointF(0.5, 0.6)
  41. << QPointF(0.4, 0.5);
  42. }
  43. QSize StarRating::sizeHint() const
  44. {
  45. return PaintingScaleFactor * QSize(myMaxStarCount, 1);
  46. }
  47. void StarRating::paint(QPainter *painter, const QRect &rect,
  48. const QPalette &palette, EditMode mode) const
  49. {
  50. painter->save();
  51. painter->setRenderHint(QPainter::Antialiasing, true);
  52. painter->setPen(Qt::NoPen);
  53. if (mode == Editable) {
  54. painter->setBrush(palette.highlight());
  55. } else {
  56. painter->setBrush(palette.foreground());
  57. }
  58. int yOffset = (rect.height() - PaintingScaleFactor) / 2;
  59. painter->translate(rect.x(), rect.y() + yOffset);
  60. //画笔坐标
  61. painter->scale(PaintingScaleFactor, PaintingScaleFactor);
  62. for (int i = 0; i < myMaxStarCount; ++i) {
  63. if (i < myStarCount) {
  64. painter->drawPolygon(starPolygon, Qt::WindingFill);
  65. } else if (mode == Editable) {
  66. painter->drawPolygon(diamondPolygon, Qt::WindingFill);
  67. }
  68. painter->translate(1.0, 0.0);
  69. }
  70. painter->restore();
  71. }

 5、实现在QTableView中绘制Pixmap图片 ,

详细请看具体例子 Qt-在表格(QTableView)中插入图片

  1. void MyItemDelegate::paint(QPainter * painter,
  2. const QStyleOptionViewItem & option,
  3. const QModelIndex & index) const
  4. {
  5. if(index.column()!=0){
  6. QItemDelegate::paint(painter,option,index);
  7. return;
  8. }
  9. const QAbstractItemModel * model=index.model();
  10. QVariant var=model->data(index,Qt::CheckStateRole);
  11. if(var.isNull()) var=false;
  12. const QPixmap & star=var.toBool()?
  13. favouritePixmap:notFavouritePixmap;
  14. int width=star.width();
  15. int height=star.height();
  16. QRect rect=option.rect;
  17. int x=rect.x()+rect.width()/2-width/2;
  18. int y=rect.y()+rect.height()/2-height/2;
  19. painter->drawPixmap(x,y,star);
  20. }

参考文章

Qt-在表格(QTableView)中插入图片

基于QItemDelegate的例子2 trackeEditorDelegate

基于QItemDelegate的例子1 SpinBoxDelegate

(六)Qt Delgate的使用 简单说明

http://qimo601.iteye.com/blog/1539147

Qt自定义委托在QTableView中绘制控件、图片、文字(内容比较全)的更多相关文章

  1. Qt自定义委托在QTableView中绘制控件、图片、文字

    自定义委托,继承于,QStyledItemDelegate类,重载Paint()函数, 1.实现在QTableView中绘制 格式字符串 2.实现在QTableView中绘制进度条 3.实现在QTab ...

  2. Qt自定义阴影效果和QOpenGLWidget冲突导致控件不刷新

    Qt5.6.2版本存在这样一个问题(其它版本未测试),当main函数中设置了application.setAttribute(Qt::AA_NativeWindows)(用于使得每个子界面都可以获取w ...

  3. Winform中TextBox控件开启自动提示补全功能

    问题:Winform开发中,有一个TextBox控件用以输入姓名,现希望在输入名字时能够自动提示所有可能的名字. 解答:winform中的TextBox控件含有如下三个属性:   ① AutoComp ...

  4. Winform中Picture控件图片的拖拽显示

    注解:最近做了一个小工具,在Winform中对Picture控件有一个需求,可以通过鼠标从外部拖拽图片到控件的上,释放鼠标,显示图片! 首先你需要对你的整个Fom窗口的AllowDrop设置Ture ...

  5. 在Paint事件中绘制控件(边框)

    单纯的自己记录,将来会继续添加,侥幸被大家发现了的话请不要太鄙视... private void panel4_Paint(object sender, PaintEventArgs e) { Con ...

  6. Winform控件根据文字内容自动调整最合适大小

    private void AutoSizeControl(Control control, int textPadding) { // Create a Graphics object for the ...

  7. paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制

    源地址:http://blog.csdn.net/attilax/article/details/12343625 paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制 效果图: ...

  8. 在WinForm中使用委托来在其他线程中改变控件的显示

    假设winform中有两个控件: 1.ListView用来显示进度的文本提示,ID:listView_progressInfo 2.ProgressBar用来显示进度,ID:progressBar1 ...

  9. Qt在表格中加入控件

    任务:使用QTableWidget动态生成表格,在每行的某两列中加入QComboBox下拉框控件和QPushButton按钮控件 有添加,删除,编辑功能,每行的按钮可以浏览文件夹并选择文件 1.新建一 ...

随机推荐

  1. zookeeper 半数可用/选举机制

    1.半数可用机制,半数可用指的是zk集群中一半以上的机器正常时集群才能正常工作 已经启动了hadoop002(follower),hadoop003(leader) 下面停止hadoop002 在ha ...

  2. 如何解决-bash: jstack: command not found,Linux安装jstack

    不少朋友在刚接触jvm的时候,通常在Linux中经常要使用jstack命令,新手经常会遇到如下问题: -bash: jstack: command not found 不用慌张,该命令位于Java/b ...

  3. 【31.58%】【codeforces 682D】Alyona and Strings

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  4. IIS相关优化

    1.修改IIS最大工作进程数 a. 请考虑以下几点: 1.每一个工作进程都会消耗系统资源和CPU占用率:太多的工作进程会导致系统资源和CPU利用率的急剧消耗: 2.每一个工作进程都具有自己的状态数据, ...

  5. 11991 - Easy Problem from Rujia Liu?(的基础数据结构)

    UVA 11991 - Easy Problem from Rujia Liu? 题目链接 题意:给一个长度n的序列,有m询问,每一个询问会问第k个出现的数字的下标是多少 思路:用map和vector ...

  6. 转载:Adb远程连接Android系统(通过网络使用ADB(Connect to android with wifi))

    本文介绍如何通过网络(尤指无线网络)与Android的adbd进行连接.原理:adb server: 计算机上的一个服务进程,进程名为adbadb daemon: Android 手机上的一个服务进程 ...

  7. OpenGL中GLSL渲染茶壶光照完整程序

    顶点着色器VertexShader.txt: uniform vec3 lightposition;//光源位置 uniform vec3 eyeposition;//相机位置 uniform vec ...

  8. BeagleBone Black第八课板:建立Eclipse编程环境

    BBB第八课板:建立Eclipse编程环境 最近建立了一个新的编程环境.感觉很方便,给大家分享.除了先前BBB董事会远程桌面直接写shell脚本或C外部程序,经Debain 7.5根据该制度还试图用编 ...

  9. QT开发环境的建立以及QTE4.6.3、tslib1.4的移植过程

    1.首先是建立Linux开发环境1.1.在windowsXP下安装博创公司提供的虚拟机软件VMware Workstation,版本为VMware-workstation-full-7.0.1-227 ...

  10. android网络开源框架volley(五岁以下儿童)——volley一些细节

    最近的一次volley整理出下一个.我以前没有再次遭遇了一些小问题,在该记录: 1.HttpUrlConnection DELETE 信息不能加入body问题:java.net.ProtocolExc ...