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

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

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

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

3、实现在QTableView中绘制QCheckBox

4、实现在QTableView中绘制星星

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

 

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

 

Qt自定义委托在QTableView中绘制控件、图片、文字_第2张图片

 

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

 

Cpp代码   收藏代码
  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.   
  14.         //获取项风格设置  
  15.         QStyleOptionViewItem myOption = option;  
  16.         myOption.displayAlignment = Qt::AlignRight | Qt::AlignVCenter;  
  17.     //绘制文本  
  18.     QApplication::style()->drawItemText ( painter, myOption.rect , myOption.displayAlignment, QApplication::palette(), true,text );  
  19.           
  20.           
  21.     }  
  22. else  
  23.     {  
  24.         //否则调用默认委托  
  25.         QStyledItemDelegate::paint(painter, option, index);  
  26.     }  
  27.       
  28. }  

 

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

 

Cpp代码   收藏代码
  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中绘制进度条

Cpp代码   收藏代码
  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.         //进度条的风格选项  
  14.         QStyleOptionProgressBarV2 *progressBarOption = new QStyleOptionProgressBarV2();  
  15.         progressBarOption->rect = option.rect;  
  16.         progressBarOption->minimum = 0;  
  17.         progressBarOption->maximum = subTaskNum;  
  18.         progressBarOption->progress = finishedSubTaskNum;  
  19.         int t = finishedSubTaskNum/subTaskNum;  
  20.         progressBarOption->text = QString::number(t) + "%";  
  21.         progressBarOption->textVisible = true;  
  22.         //绘制进度条  
  23.         QApplication::style()->drawControl(QStyle::CE_ProgressBar, progressBarOption, painter);  
  24.   
  25.     }  
  26.    else  
  27.     {  
  28.         //否则调用默认委托  
  29.         QStyledItemDelegate::paint(painter, option, index);  
  30.     }  
  31.       
  32. }  

  3、实现在QTableView中绘制QCheckBox

 

 

Java代码   收藏代码
  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.     }  
  31.   
  32.     else  
  33.     {  
  34.         //否则调用默认委托  
  35.         QStyledItemDelegate::paint(painter, option, index);  
  36.     }  
  37.       
  38. }  

    //生成QCheckBox

Cpp代码   收藏代码
  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中绘制自定义类 星星

 

Cpp代码   收藏代码
  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.   
  13.         starRating.paint(painter, option.rect, option.palette,  
  14.                          StarRating::ReadOnly);  
  15.     }  
  16.     //如果没有控件选中,调用默认委托  
  17.     else {  
  18.         QStyledItemDelegate::paint(painter, option, index);  
  19.     }  
  20. }  
 

星星自定义源文件

 

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

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

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

 

Cpp代码   收藏代码
  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.     
  15.     int width=star.width();    
  16.     int height=star.height();    
  17.     QRect rect=option.rect;    
  18.     int x=rect.x()+rect.width()/2-width/2;    
  19.     int y=rect.y()+rect.height()/2-height/2;    
  20.     
  21.     painter->drawPixmap(x,y,star);    
  22. }    

你可能感兴趣的:(Qt自定义委托在QTableView中绘制控件、图片、文字)