一个表格的进化史(六)

2018-04-20 22:15:20  阅读 110 次 评论 1 条

    前两篇内容说的都是Qt在表格进行编辑操作,我们可以在表格中加入不同的控件来帮助我们完成编辑操作。不过有时候我们需要在表格中加入一些无需交互的控件,例如放一个进度条表示下载的进度,在表格中放一张图片表示不同的状态等等。那我们该怎么做呢?

    我们可以使用上一篇中的delegate来帮助我们实现这样的目的,只需要重写它的paint函数就可以了。

virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;

   以进度条为例(随便选择一个列进行绘制):

if(index.column() == 2){ //绘制进度条
        QStyleOptionProgressBarV2* progressOpt = new QStyleOptionProgressBarV2();
        progressOpt->rect = option.rect.adjusted(5,5,-5,-5);
        progressOpt->minimum = 0;
        progressOpt->maximum = 100;
        progressOpt->progress = 66;  //设置固定的值
        progressOpt->text = "66%";
        progressOpt->textVisible = true;
        progressOpt->textAlignment = Qt::AlignCenter;
        QApplication::style()->drawControl(QStyle::CE_ProgressBar,progressOpt,painter);
}

重写paint函数,在其中调用drawControl()函数绘制控件,其中QStyleOptionProgressBarV2描述了进度条控件绘制的属性。例子中使用了固定的值,实际应用中可以根据model中的值进行设置。效果如下:


blob.png

 要绘制图片就更简单了直接看代码:

    }else if(index.column() == 0){
         QPixmap pixmap("f:/05_test/icon.png");
         QApplication::style()->drawItemPixmap(painter,option.rect,Qt::AlignCenter,pixmap);
    }

 blob.png

   仔细观察paint的参数,我们可以发现有painter还有option。既然拿到了painter又知道了Item的区域了,那不是想画什么就画什么吗?只要你脑洞够大。可惜我脑洞不够大,那就画个圆意思意思吧:

    }else if(index.column() == 0){
//         QPixmap pixmap("f:/05_test/icon.png");
//         QApplication::style()->drawItemPixmap(painter,option.rect,Qt::AlignCenter,pixmap);
        painter->setRenderHint(QPainter::Antialiasing);
        painter->setPen(Qt::NoPen);
        if(index.row()%2){
            painter->setBrush(Qt::green);
        }else{
            painter->setBrush(Qt::red);
        }

        QPoint ct = option.rect.center();
        QRect rc = QRect(ct.x() - 5,ct.y() - 5,10,10);//居中,半径为5.
        painter->drawEllipse(rc);
    }

blob.png


本文地址:http://fearlazy.com/index.php/post/67.html
版权声明:本文为原创文章,版权归 fearlazy 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

评论列表

  1. 要昵称
    要昵称  @回复

    最后那个效果不错的!