Qt模型视图中委托深入分析

项目一:

源码分析:

void CustomizedItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    if(2 == index.column())
    {
        const int Delta = 4;
        int x = option.rect.x() + Delta;
        int y = option.rect.y() + Delta;
        int width = option.rect.width() - 2*Delta;
        int height = option.rect.height() - 2*Delta;
        
        
        int progress = index.data(Qt::DisplayRole).toInt();
        QStyleOptionProgressBar progressBar;
        
        progressBar.minimum = 0;
        progressBar.maximum = 100;
        progressBar.progress = progress;
        progressBar.rect = QRect(x, y, width, height);
        progressBar.textVisible = true;
        progressBar.textAlignment = Qt::AlignCenter;
        progressBar.text = QString("%1%").arg(progress);
        
        
        QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBar, painter);
    }
    else
    {
        QItemDelegate::paint(painter, option, index);
    }
}

bool CustomizedItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
    bool ret = true;
    
    if(QEvent::MouseButtonDblClick != event->type())
    {
        ret = QItemDelegate::editorEvent(event, model, option, index);
    }
    
    return ret;
}

 项目二:

 源码分析:

void CustomizedItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    if(QVariant::Bool == index.data(Qt::DisplayRole).type())
    {
        QStyleOptionButton check;
        check.state = index.data().toBool() ? QStyle::State_On : QStyle::State_Off;
        check.state |= QStyle::State_Enabled;
        check.rect = option.rect;
        check.rect.setX(option.rect.x() + option.rect.width()/2 - 6);
        
        QApplication::style()->drawControl(QStyle::CE_CheckBox, &check, painter);
    }
    else 
    {
        QItemDelegate::paint(painter, option, index);
    }
}

bool CustomizedItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
    bool ret = true;
    qDebug() << "CustomizedItemDelegate::editorEvent";
    
    if(QVariant::Bool == index.data().type())
    {
        QMouseEvent* mouse = dynamic_cast<QMouseEvent*>(event);
        
        if( (NULL != mouse) && (QEvent::MouseButtonPress == mouse->type()) && (option.rect.contains(mouse->pos())) )
        {
            model->setData(index, !index.data().toBool(), Qt::DisplayRole);
        }
    }
    else
    {
        ret = QItemDelegate::editorEvent(event, model, option, index);
    }
    
    return ret;
}

源码链接(总共2个):DelegateDeep.rar-QT文档类资源-CSDN下载

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值