Qt-QTreeView自定义树控件

在中大型项目中,自定义Qt的QTreeView控件能解决Qt原生控件的抽象性、复杂性和统一外观风格的问题。本文介绍了如何通过创建CustomTree和CustomTreeItemDelegate两个类来实现自定义,虽然初期理解难度较大,但有助于提高代码维护性。示例代码展示了具体用法,并展示了自定义控件的效果。
摘要由CSDN通过智能技术生成

Qt-QTreeView自定义树控件

在做中大型项目时,可能又成百上千个功能界面,而这些功能界面无非就是数据的输入与输出,那么对常用的控件进行定制是非常重要的。本人认为Qt的原生控件使用起来有以下几点问题:
1、 Qt控件为了兼容各种情况,设计得是比较抽象的,对于新员工来说理解起来比较困难,接口调用也复杂;
2、 不同的人对代码理解不同,Qt的控件用起来也是各显神通,后期维护起来非常困难;
3、 每个公司的产品有自己的外观风格,定制控件可以同一实现外观,无需开发人员自己处理。
可能刚刚看感觉比想象中的复杂一点,但是只要多看几遍就会清楚为什么Qt的控件要这样设计,项绘制部分参考了网上的代码。
主要自定义两个类,CustomTree和CustomTreeItemDelegate,类关系如下图:
在这里插入图片描述
核心代码:


void CustomTreeDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
   
    painter->setRenderHint(QPainter::Antialiasing);

    //绘制背景
    QColor colorBg;
    if (option.state & QStyle::State_Selected)
    {
   
        colorBg = m_view->checkedBgColor();
    }
    else if (option.state & QStyle::State_MouseOver)
    {
   
        colorBg = m_view->hoverBgColor();
    }
    else
    {
   
        colorBg = m_view->bgColor();
    }
    QRect bgRect(0, option.rect.top(), m_view->width(), option.rect.height()); // 直接用option.rect,二级树左边有空白
    painter->fillRect(bgRect, colorBg);

    // 绘制checked状态的item的右侧三角形
    if (option.state & QStyle::State_Selected)
    {
   
        painter->setPen(Qt::NoPen);
        painter->setBrush(m_view->checkedTextColor());
        QVector<QPointF> points;
        points.append(QPointF(option.rect.right(), option.rect.top() + option.rect.height() * 0.3));
        points.append(QPointF(option.rect.right(), option.rect.top() + option.rect.height() * 0.7));
        points.append(QPointF(option.rect.right() - option.rect.height() * 0.3, option.rect
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值