Qt-自定义委托类QStyledItemDelegate实现在QTableview中插入comboBox,comboBox可动态插入数据

效果:

在这里插入图片描述

实现原理:

自定义委托类,重写以下函数:
createEditor()
updateEditorGeometry()
setModelData()
setEditorData()

还可以重写**paint()**函数,绘制进度条,按钮等。

委托类代码:

.h

#ifndef CUSTOMERQSTYLEDITEMDELEGATE_H
#define CUSTOMERQSTYLEDITEMDELEGATE_H
#include <QStyledItemDelegate>

class CustomerQStyledItemDelegate : public QStyledItemDelegate
{
   
public:
    CustomerQStyledItemDelegate();
    ~CustomerQStyledItemDelegate(){
   }
protected:
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
};

#endif // CUSTOMERQSTYLEDITEMDELEGATE_H

.cpp

#include "CustomerQStyledItemDelegate.h"
#include <QProgressBar>
#include <QApplication>
#include <QComboBox>
#include "mTableModel.h"
#include "QDebug"

CustomerQStyledItemDelegate::CustomerQStyledItemDelegate()
{
   

}

void CustomerQStyledItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
   
        QStyleOptionViewItem viewOption(option);
        initStyleOption(&viewOption, index);
        if (option.state.testFlag(QStyle::State_HasFocus))
            viewOption.state = viewOption.state ^ QStyle::State_HasFocus;

        QStyledItemDelegate::paint(painter, viewOption, index);

        if (index.column() == 2)
        {
   
            int nProgress = index.model()->data(index, Qt::UserRole).toInt();
            int nLeft = 8;
            int nTop = 8;
            int nWidth = option.rect.width() - 2 * nLeft;
            int nHeight = option.rect.height() - 2 * nTop;

            // 设置进度条的风格
            QStyleOptionProgressBar progressBarOption;
            progressBarOption.initFrom(option.widget);
            // 设置进度条显示的区域
            progressBarOption.rect = QRect(option.rect.left() + nLeft, option.rect.top() + nTop,  nWidth, nHeight);
            // 设置最小值
            progressBarOption
  • 2
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值