`
qimo601
  • 浏览: 3444006 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

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

    博客分类:
  • Qt
阅读更多

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

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

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

3、实现在QTableView中绘制QCheckBox

4、实现在QTableView中绘制星星

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

 

 

 

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

 

//重载绘制函数
void DelReconQueue::paint(QPainter *painter, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const
{
    //如果是第2列'病人Id'
    if (index.column() == 2)
    {
        //获得当前项值
        int patientId = index.model()->data(index, Qt::DisplayRole).toInt();
        //设置'病人Id'格式字符串: P:00000x;6位10进制数,不足补0;
        QString text = QString("P:%1").arg(patientId, 6, 10, QChar('0'));


        //获取项风格设置
        QStyleOptionViewItem myOption = option;
        myOption.displayAlignment = Qt::AlignRight | Qt::AlignVCenter;
	//绘制文本
	QApplication::style()->drawItemText ( painter, myOption.rect , myOption.displayAlignment, QApplication::palette(), true,text );
		
        
    }
else
    {
        //否则调用默认委托
        QStyledItemDelegate::paint(painter, option, index);
    }
    
}

 

   如果自定义委托继承于QItemDelegate类,绘制字符串,可以直接用QItemDelegate中的drawDisplay();

 

void TrackDelegate::paint(QPainter *painter,  
                          const QStyleOptionViewItem &option,  
                          const QModelIndex &index) const  
{  
    //保存音轨的列  
    if (index.column() == durationColumn) {  
        //获得索引对应Model中的数据  
        int secs = index.model()->data(index, Qt::DisplayRole).toInt();  
        //设置时间格式字符串 分:秒  
        QString text = QString("%1:%2")  
                       .arg(secs / 60, 2, 10, QChar('0'))  
                       .arg(secs % 60, 2, 10, QChar('0'));  
        //获取项风格设置  
        QStyleOptionViewItem myOption = option;  
        myOption.displayAlignment = Qt::AlignRight | Qt::AlignVCenter;  
        //绘制文本  
        drawDisplay(painter, myOption, myOption.rect, text);  
        //如果当前有焦点,就绘制一个焦点矩形,否则什么都不做  
        drawFocus(painter, myOption, myOption.rect);  
    } else{  
        //否则默认  
        QItemDelegate::paint(painter, option, index);  
    }  
}  
  

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

//重载绘制函数
void DelReconQueue::paint(QPainter *painter, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const
{
    //如果是'已经完成子任务数'
     if (index.column() == 9)
    {
        const QAbstractItemModel *itemModel = index.model();
        //获得索引对应Model中的数据
        int finishedSubTaskNum = itemModel->data(index, Qt::DisplayRole).toInt();
        int subTaskNum = itemModel->data(itemModel->index(index.row(),8), Qt::DisplayRole).toInt();

		//进度条的风格选项
        QStyleOptionProgressBarV2 *progressBarOption = new QStyleOptionProgressBarV2();
        progressBarOption->rect = option.rect;
        progressBarOption->minimum = 0;
        progressBarOption->maximum = subTaskNum;
        progressBarOption->progress = finishedSubTaskNum;
        int t = finishedSubTaskNum/subTaskNum;
        progressBarOption->text = QString::number(t) + "%";
        progressBarOption->textVisible = true;
		//绘制进度条
        QApplication::style()->drawControl(QStyle::CE_ProgressBar, progressBarOption, painter);

    }
   else
    {
        //否则调用默认委托
        QStyledItemDelegate::paint(painter, option, index);
    }
    
}

  3、实现在QTableView中绘制QCheckBox

 

 

#include <QtGui>
#include <QItemDelegate>
#include <QStyleOptionProgressBarV2>
#include "DelReconQueue.h"
//重载绘制函数
void DelReconQueue::paint(QPainter *painter, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const
{
     if (index.column() == 11)
    {
        //获取值
        bool checked = index.model()->data(index, Qt::DisplayRole).toBool();
		//按钮的风格选项
        QStyleOptionButton *checkBoxOption = new QStyleOptionButton();
        checkBoxOption->state |= QStyle::State_Enabled;
        //根据值判断是否选中
        if(checked)
        {
            checkBoxOption->state |= QStyle::State_On;
        }
        else
        {
            checkBoxOption->state |= QStyle::State_Off;
        }
        //返回QCheckBox几何形状
        checkBoxOption->rect = CheckBoxRect(option);
        //绘制QCheckBox
        QApplication::style()->drawControl(QStyle::CE_CheckBox,checkBoxOption,painter);

    }

    else
    {
        //否则调用默认委托
        QStyledItemDelegate::paint(painter, option, index);
    }
    
}

    //生成QCheckBox

QRect DgSystemLog::CheckBoxRect(const QStyleOptionViewItem &viewItemStyleOptions)const
{
    //绘制按钮所需要的参数
    QStyleOptionButton checkBoxStyleOption;
    //按照给定的风格参数 返回元素子区域
    QRect checkBoxRect = QApplication::style()->subElementRect( QStyle::SE_CheckBoxIndicator, &checkBoxStyleOption);
    //返回QCheckBox坐标
    QPoint checkBoxPoint(viewItemStyleOptions.rect.x() + viewItemStyleOptions.rect.width() / 2 - checkBoxRect.width() / 2,
                         viewItemStyleOptions.rect.y() + viewItemStyleOptions.rect.height() / 2 - checkBoxRect.height() / 2);
    //返回QCheckBox几何形状
    return QRect(checkBoxPoint, checkBoxRect.size());
}
 

 

4、实现在QTableView中绘制自定义类 星星

 

//重载绘制函数
void StarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                         const QModelIndex &index) const
{
    //如果某项数据是星星类型
    if (qVariantCanConvert<StarRating>(index.data())) {
        //获取该项数据,并转换成StarRating类型
        StarRating starRating = qVariantValue<StarRating>(index.data());
        //如果有控件被选中,我们就让选中的控件变亮
        if (option.state & QStyle::State_Selected)
            painter->fillRect(option.rect, option.palette.highlight());

        starRating.paint(painter, option.rect, option.palette,
                         StarRating::ReadOnly);
    }
    //如果没有控件选中,调用默认委托
    else {
        QStyledItemDelegate::paint(painter, option, index);
    }
}
 

星星自定义源文件

 

#ifndef STARRATING_H
#define STARRATING_H

#include <QMetaType>
#include <QPointF>
#include <QVector>

class StarRating
{
public:
    enum EditMode { Editable, ReadOnly };

    StarRating(int starCount = 1, int maxStarCount = 5);

    void paint(QPainter *painter, const QRect &rect,
               const QPalette &palette, EditMode mode) const;
    QSize sizeHint() const;
    int starCount() const { return myStarCount; }
    int maxStarCount() const { return myMaxStarCount; }
    void setStarCount(int starCount) { myStarCount = starCount; }
    void setMaxStarCount(int maxStarCount) { myMaxStarCount = maxStarCount; }

private:
    QPolygonF starPolygon;
    QPolygonF diamondPolygon;
    int myStarCount;
    int myMaxStarCount;
};

//让所有模板类型都知道该类,包括QVariant
Q_DECLARE_METATYPE(StarRating)

#endif



#include <QtGui>
#include <math.h>

#include "starrating.h"

const int PaintingScaleFactor = 20;

StarRating::StarRating(int starCount, int maxStarCount)
{
    myStarCount = starCount;
    myMaxStarCount = maxStarCount;

    starPolygon << QPointF(1.0, 0.5);
    for (int i = 1; i < 5; ++i)
        starPolygon << QPointF(0.5 + 0.5 * cos(0.8 * i * 3.14),
                               0.5 + 0.5 * sin(0.8 * i * 3.14));

    diamondPolygon << QPointF(0.4, 0.5) << QPointF(0.5, 0.4)
                   << QPointF(0.6, 0.5) << QPointF(0.5, 0.6)
                   << QPointF(0.4, 0.5);
}

QSize StarRating::sizeHint() const
{
    return PaintingScaleFactor * QSize(myMaxStarCount, 1);
}

void StarRating::paint(QPainter *painter, const QRect &rect,
                       const QPalette &palette, EditMode mode) const
{
    painter->save();

    painter->setRenderHint(QPainter::Antialiasing, true);
    painter->setPen(Qt::NoPen);

    if (mode == Editable) {
        painter->setBrush(palette.highlight());
    } else {
        painter->setBrush(palette.foreground());
    }

    int yOffset = (rect.height() - PaintingScaleFactor) / 2;
    painter->translate(rect.x(), rect.y() + yOffset);
    //画笔坐标
    painter->scale(PaintingScaleFactor, PaintingScaleFactor);

    for (int i = 0; i < myMaxStarCount; ++i) {
        if (i < myStarCount) {
            painter->drawPolygon(starPolygon, Qt::WindingFill);
        } else if (mode == Editable) {
            painter->drawPolygon(diamondPolygon, Qt::WindingFill);
        }
        painter->translate(1.0, 0.0);
    }

    painter->restore();
}

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

详细请看具体例子 Qt-在表格(QTableView)中插入图片

 

void MyItemDelegate::paint(QPainter * painter,  
                           const QStyleOptionViewItem & option,  
                           const QModelIndex & index) const  
{  
    if(index.column()!=0){  
        QItemDelegate::paint(painter,option,index);  
        return;  
    }  
    const QAbstractItemModel * model=index.model();  
    QVariant var=model->data(index,Qt::CheckStateRole);  
    if(var.isNull()) var=false;  
    const QPixmap & star=var.toBool()?  
favouritePixmap:notFavouritePixmap;  
  
    int width=star.width();  
    int height=star.height();  
    QRect rect=option.rect;  
    int x=rect.x()+rect.width()/2-width/2;  
    int y=rect.y()+rect.height()/2-height/2;  
  
    painter->drawPixmap(x,y,star);  
}  
 

参考文章

 

Qt-在表格(QTableView)中插入图片 

基于QItemDelegate的例子2 trackeEditorDelegate

基于QItemDelegate的例子1 SpinBoxDelegate 

(六)Qt Delgate的使用 简单说明

3
0
分享到:
评论
1 楼 美丽的小岛 2014-08-24  

相关推荐

    qtableview 自定义委托 checkbox,进度条、时间等控件

    这个自定义委托的概念在标题和描述中被提及,意味着我们将探讨如何在QTableView中添加复选框、进度条和时间等控件。 自定义委托是Qt提供的一种机制,允许开发人员为表格视图中的每一项数据创建个性化的显示和编辑...

    QTableView添加复选框,下拉框控件

    当我们想要在QTableView中添加复选框或下拉框时,就需要创建一个自定义的委托类来处理这些控件的绘制和交互逻辑。 对于复选框,我们可以继承QStyledItemDelegate,并重写`paint()`方法,以便在绘制项时添加一个复选...

    QT 自定义混合控件——基于View/Model/Delegate的QTableView/QTreewidget/Combobox实现

    在本项目"QT自定义混合控件——基于View/Model/Delegate的QTableView/QTreewidget/Combobox实现"中,我们将深入探讨如何利用QT库中的核心组件构建一个强大的数据展示和交互界面。 首先,我们要理解View/Model/...

    Qt自定义代理,委托,自定义开关

    在Qt中,代理(QItemDelegate)和委托(QSortFilterProxyModel)是两个关键概念,它们对于实现复杂的数据显示和交互功能至关重要。本文将深入探讨这两个概念,并结合自定义开关控件进行讲解。 首先,让我们了解...

    QT在QTableView的一列里添加两个按钮

    5. **QAbstractItemView::setIndexWidget()**:为了在QTableView的特定单元格中放置自定义控件,我们需要调用此方法。它接受一个QModelIndex和一个QWidget,将控件绑定到模型的特定索引上。 6. **事件过滤器**:...

    Qt编程-QTableView同时冻结行和列

    在Qt编程中,QTableView是用于显示表格数据的控件,常见于数据密集型的应用程序。当处理大型数据集时,冻结行和列可以提高用户的交互体验,让他们更容易浏览和理解表格内容。QTableView默认并不支持直接冻结行列,但...

    自定义QTableView的表头QHeaderView实现多行表头

    1.自定义了一个表格View(TcTableView),支持继承重载相关虚函数, 2.TcTabelView支持设置多行横向表头(默认2行), 3.可以添加多张表格,每个表格是独立的,它们都有属于自己的自定义表头。 4.表头的右键操作我是自己写...

    qt,QTableView实现复选框,分页功能

    在Qt框架中,QTableView是用于显示表格数据的控件,它可以很好地与各种模型(如QStandardItemModel或QSqlTableModel)结合使用。本教程将详细讲解如何在QTableView中实现复选框、分页和查询功能,并涉及与MySQL...

    QTableView 插入按钮等各种控件实例

    在本文中,我们将深入探讨如何在Qt环境中使用`QTableView`控件来插入和添加各种交互式元素,如按钮、复选框、日期选择器以及列表选择等。`QTableView`是Qt库中的一个关键组件,它允许我们展示和操作二维表格数据。这...

    QTableView显示自定义CheckBox

    在Qt框架中,`QTableView`是一个非常常用的控件,用于展示二维表格数据。而有时候,我们可能需要在表格的某一列中显示可选的复选框(CheckBox),以供用户进行选择操作。本篇文章将深入讲解如何在`QTableView`中实现...

    QT自定义委托类代理类.rar

    在QT中,"委托类"(QItemDelegate)与"代理类"(QAbstractItemView)是数据展示的核心组件,特别是在处理表格(QTableView)、列表(QListView)和树形视图(QTreeView)时。本压缩包文件"QT自定义委托类代理类.rar...

    QT下Mingw实现QTtableview中实现添加复选框、按钮控件实例

    本实例将探讨如何在QTTableView中集成复选框和按钮控件,以增强用户界面的交互性。QTTableView是QT框架中的一个关键组件,它允许我们展示和操作表格数据。下面将详细讲解这一实现过程。 1. **QT与Mingw**: Mingw...

    Qt之QTableView添加复选框

    在Qt框架中,QTableView是用于显示表格数据的控件,它可以用来展示数据库或模型数据。本教程将深入探讨如何在QTableView中添加复选框,特别是在表头和第一列中实现这一功能,以增强用户界面的交互性。 首先,我们要...

    QT自定义多行表头

    在QT中,QTableView是用于显示表格数据的控件,它允许用户查看和编辑二维表格数据。当我们需要创建更复杂的表格布局,例如带有多行表头的表格时,QT提供了丰富的自定义能力。 "QT自定义多行表头"这个主题主要涉及到...

    QTableView 中单元格添加控件的实例代码

    `createEditor()`方法用于创建要在单元格内显示的控件,`setEditorData()`设置控件的初始数据,`setModelData()`则将用户在控件中的修改反映回模型,`paint()`负责绘制单元格的外观。 以下是一个基本的实现步骤: ...

    QTableView/QTableWidget自定义表头,添加复选框,下拉框控件

    在Qt框架中,`QTableView`和`QTableWidget`是两种常用的用于显示二维数据的控件。在一些复杂的用户界面设计中,我们可能需要对表头进行自定义,例如添加复选框或下拉框,以提供更丰富的交互功能。在本篇中,我们将...

    QTableView中添加各种代码(QSpinBox QconboBox QPushbutton 等)

    在Qt框架中,QTableView是用于显示表格数据的控件,它可以用来展示数据库或模型数据。在实际开发中,我们经常需要对QTableView进行自定义,例如在其单元格内添加更多的交互元素,如QSpinBox(数值选择器)、...

    qtableview和model配合使用,实现复杂功能

    在Qt框架中,QTableView是用于显示表格数据的控件,而Model/View体系则是Qt设计模式的核心部分,它提供了一种灵活的方式来管理和显示数据。本篇将详细讲解如何利用QTableView与Model协同工作,实现复杂的功能,如在...

    QTableView插入各种按钮

    在Qt框架中,QTableView是用于显示表格数据的控件,它是Qt Widgets模块的一部分,广泛应用于桌面应用开发。QTableView可以结合QAbstractItemModel或QStandardItemModel来展示数据,并允许用户进行交互,如编辑、排序...

    QT的TableView实现多级表头

    在QT编程中,`QTableView` 是一个非常重要的控件,用于显示二维表格数据,它可以从`QAbstractItemModel`的子类获取数据。在实际应用中,有时我们需要实现多级表头,以便更好地组织和展示复杂的数据结构。标题“QT的...

Global site tag (gtag.js) - Google Analytics