QT 使用QLsitView 实现数据的分组多级显示,子列表可动态显示/隐藏

本文介绍了一种在QT中使用QListView创建多级显示的解决方案,通过自定义QWidget和按钮实现树形结构,并分享了部分代码,包括按钮绘制逻辑。
摘要由CSDN通过智能技术生成

效果图

在这里插入图片描述


概述

  • 在QT中多级显示应该是QTreeView该干的事,但是当我们还需要图标显示的时候,也就是 setViewMode(QListView::IconMode)QTreeView就无法满足了。
  • 描述下核心思想:整体分为俩层结构,都是继承于QWidget
    1. 最上层为一个QWidget,用于存放所有第二级的QWidget
    2. 第二层为QWidget,就也是所看到的每一个组。里面都有一个QListView,用于控制隐藏/显示,看似为一个按钮,其实也是一个QWidget
    3. 也就是说整体就是有多个组拼起来的,而每个组中都有一个QListView按钮,从而形成多级结构。
  • 图中所示虽然只有俩级,但还可以再加三级,四级…,完全可以实现树的多级显示。

部分代码

  • 代码好像都没啥好描述的,主要就是实现思路,自己去拉源码看吧。这里就贴下按钮的绘制吧。
void ControlToolButtons::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setRenderHint(QPainter::TextAntialiasing);
    painter.fillRect(event->rect(), QColor(qRgb(235, 243, 254)));

    QPen pen;
    QColor colorNormal("#005A92");
    QColor colorPressed("#036EB7");
    pen.setWidth(1);
    pen.setColor(m_isPressed ? colorPressed : colorNormal);
    painter.setPen(pen);
    QFont font("Microsoft YaHei");
    font.setPixelSize(14);
    font.setBold(true);
    painter.setFont(font);
    int w = QFontMetrics(font).width(m_text);
    int h = QFontMetrics(font).height();
    QRect rect(10, (height() - h) / 2, w + 1, h + 1);
    painter.drawText(rect, m_text);

    QPainterPath path;
    int width = event->rect().width();
    if (!m_isHovered)
    { // 展开
        QPoint pos1(width - 10, 12);
        QPoint pos2(width - 20, 12);
        QPoint pos3(width - 15, 17);
        path.moveTo(pos1);
        path.lineTo(pos2);
        path.lineTo(pos3);
        path.lineTo(pos1);
        painter.fillPath(path, m_isPressed ? colorPressed : colorNormal);
    }
    else
    { // 收缩
        QPoint pos1(width - 20, 12);
        QPoint pos2(width - 20, 18);
        QPoint pos3(width - 12, 15);
        path.moveTo(pos1);
        path.lineTo(pos2);
        path.lineTo(pos3);
        path.lineTo(pos1);
        painter.fillPath(path, m_isPressed ? colorPressed : colorNormal);
    }
    pen.setColor(QColor(206, 206, 206));
    pen.setWidth(2);
    painter.setPen(pen);
    painter.drawRect(event->rect());
}

总结

  • 知识理应共享,源码在此。
  • 这个示例中的功能点,还是比较简单的,只要你理解了思路,应该可以轻松实现。
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值