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


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

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

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

    3、实现在QTableView中绘制QCheckBox

    4、实现在QTableView中绘制星星

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

    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. }    
  • 相关阅读:
    try,except,finally的用法
    python实现蓝牙通信
    分布式全局ID的几种生成方案
    为什么要两次调用encodeURI来解决乱码问题
    jenkins配置到gitlab拉代码
    查看IOS-app证书到期时间
    使用SSH方式实现Git远程连接GitHub/gitlab
    Git 分支
    jenkins构建后操作archive the artfacts的用法
    MAC 安装jenkins
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/3757497.html
Copyright © 2020-2023  润新知