QT进度条代理的实现

目的

进度条也是一个基本的功能,这里进度条想在Tableview里面实现,让Tableview其中一个单元格显示进度条,因为就用了代理。
什么是代理,官方说:
代理(Delegate)就是在视图组件上为编辑数据提供编辑器,如在表格组件中编辑一个单元格数据时,缺省是使用一个OLineEdit编辑框。
代理负责从数据模型获取相应的数据,然后显示在编辑器里,修改数据后,又将其保存到数据模型中。
这个代理,我理解时,也感觉挺复杂,又做这做那的。
其实想想,其非常的简单,代理就是新的控件替换了原来控件的部分或者全部功能,新的控件就叫代理;就是对别的控件的引入,就是这么简单,在使用中,慢慢体验。

实现过程

滚动条的代理实现:

#include "progressbardelegate.h"
ProgressBarDelegate::ProgressBarDelegate(QObject *parent) :
    QItemDelegate(parent)
{
    
    
}
void ProgressBarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    
    
    //if(index.isValid() && index.column() == 1)
    if(index.isValid())
    {
    
    
        int value = index.model()->data(index).toInt();
        QStyleOptionProgressBar progressBarOption;
        //progressBarOption.rect = option.rect.adjusted(4, 4, -4, -4);
        progressBarOption.rect = option.rect;
        progressBarOption.minimum = 0;
        progressBarOption.maximum = 100;
        progressBarOption.textAlignment = Qt::AlignRight;
        progressBarOption.textVisible = true;
        progressBarOption.progress = value;
        progressBarOption.text = tr("%1%").arg(progressBarOption.progress);
        painter->save();
        if (option.state & QStyle::State_Selected) {
    
    
            painter->fillRect(option.rect, option.palette.highlight());
                    painter->setBrush(option.palette.highlightedText());
        }
        QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter);
        painter->restore();
    }
    else
    {
    
    
        QItemDelegate::paint(painter, option, index);
    }
}

滚动条的代理的应用:

.......
m_delegate = new ProgressBarDelegate();
    //ui->tableView->setItemDelegate(m_delegate);
    ui->tableView->setItemDelegateForColumn(1, m_delegate);
    timer = new QTimer();
    connect(timer, &QTimer::timeout, this, &MainWindow::download);
    timer->setInterval(1000);
    timer->start();
....
    void MainWindow::download()
{
    
    
    for(auto i = 0; i < this->m_tableViewModel->getStandardItemModel()->rowCount(); i++)
    {
    
    
        int value = this->m_tableViewModel->getStandardItemModel()->index(i,1).data().toInt();
        value++;
        this->m_tableViewModel->getStandardItemModel()->setData(this->m_tableViewModel->getStandardItemModel()->index(i,1), value);
    }
}

最终的效果:
在这里插入图片描述

总结

这个效果实现的关键在于:
void ProgressBarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
QItemDelegate,该类提供了在视图中绘制项目数据和编辑项目模型中的数据的函数的默认实现。
提供了在QAbstractItemDelegate中定义的paint()和sizeHint()虚拟函数的默认实现,以确保委托实现视图所期望的正确基本行为。
您可以在子类中重新实现这些函数,以自定义项的外观。
这一个函数的实现,这一个函数的目的就是控件状态,包括默认状态等状态,简单来说就是显示的样子。
因为,没有用到编辑,所以那些Edit相碰的函数都没有写,比如 createEditor(…),setModelData(…)
这就是进度控件代理的实现。
其本质就是在一个控件上引入了另一个控件,代理就是引入的那个控件,这里代理就是ProgressBarDelegate,这样就会明白很多:
这里的代理就是替换的意思,控件2替换了控件1部分区域的行为,那么控件2就是代理:
代理控件2以控件1的名义进行行为,实际执行的就是代理控件1的行为,因为这里是一种替换的关系。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/maokexu123/article/details/131479719
今日推荐