逆枫゛

Qt学习群:1149411109 群文件提供博客源码,定期答疑、更新学习资料。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1,简介

前文介绍了使用自定义model的基本方法,重点强调了该方法带来的性能上的优点。
其实自定义model还能更方便地对内容进行一些属性控制,比如前景色、背景色、对齐、文本内容、字体等等。
主要就是在data函数内对各种role进行处理。具体哪些种类可以参考ItemDataRole类型。
下面示例对文本对齐和内容颜色的控制。

2,效果

控制对齐:指定首列左对齐,作为tree层级关系列,显示效果好点。
中间分数列,即第2~6列右对齐,因为都是数字,右对齐容易观看和比对大小。
后面评价列,居中对齐即可。

控制颜色:将所有的不合格标为红色,醒目。

原图效果:
原图效果

进行对齐和颜色处理后的效果:
进行对齐和颜色处理后的效果

3,原理

在上文的基础上,对data函数进行增加处理,
分别处理Qt::TextAlignmentRole、Qt::TextColorRole两种类型属性:

QVariant TreeModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
    if (role == Qt::DisplayRole)
    {
        return item->data(index.column());
    }
    else if( role == Qt::TextAlignmentRole )
    {
        if( index.column() == 0 )
        {
            //第1列左对齐
            return QVariant(Qt::AlignVCenter | Qt::AlignLeft);
        }
        else if( index.column() > 0 && index.column() < 6 )
        {
            //第2~6列右对齐
            return QVariant(Qt::AlignVCenter | Qt::AlignRight);
        }
        else
        {
            //其他列居中对齐
            return QVariant(Qt::AlignCenter);
        }
    }
    else if(role == Qt::TextColorRole)
    {
        if(index.column() == 6)
        {
            QString str = item->data(6).toString();
            if(str == QStringLiteral("不合格"))
            {
                //第7列(是否合格)如果不合格就设文本为红色
                return QVariant(QColor("#FF0000"));
            }
        }
        return QVariant();
    }
    return QVariant();
}

4,源码

本文示例源码下载:
TreeDemo14 自定义model,控制对齐和颜色

posted on 2018-05-29 15:34  逆枫゛  阅读(579)  评论(0)    收藏  举报