QT 使用QLsitView 实现多个子项选中取消效果

news/2024/6/16 17:34:36

文章目录

      • 效果图
      • 概述
      • 部分代码
      • 总结

效果图

在这里插入图片描述


概述

  • 整个界面的布局介绍请看这篇博客
  • 想要的到这种自由选择中的Item效果,需要使用到Model-view的思想,每个item中都要存放一个标志位,用在Paint函数去判断是否绘制为按下的状态。
  • 每次item被点击时,更新标志位,并刷新视图,从而实现点击后变色的效果。

部分代码

  • 自定义委托中实现paint函数。
void CustomDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    int radius = 10;
    painter->setRenderHint(QPainter::Antialiasing);
    painter->setPen(Qt::NoPen);
    if (index.model()->data(index, Qt::UserRole).toBool())
    {
        painter->setBrush(QColor("#d9d9d9"));
        painter->drawRoundedRect(option.rect.adjusted(2, 2, -2, -2), radius, radius);
    }

    if (option.state & QStyle::State_MouseOver || option.state & QStyle::State_Selected)
    {
        painter->setBrush(QColor("#e4e4e4"));
        painter->drawRoundedRect(option.rect.adjusted(2, 2, -2, -2), radius, radius);
    }
    if (QStyle::State_HasFocus & option.state)
    {
    }
    QStyledItemDelegate::paint(painter, option, index);
}
  • 重写editorEvent函数,这个的目的是忽悠掉qt的这几个事件,这样就不会绘制qt的默认的焦点框了
bool CustomDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
    if (event->type() == QEvent::MouseMove || event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonDblClick)
    {
        return true;
    }
    return QStyledItemDelegate::editorEvent(event, model, option, index);
}

  • 在listview中,设置样式,不让悬浮出现自带的样式
setStyleSheet("QListView::item:hover { background: transparent; border: none; }");
  • item被点击时,触发更改
    connect(m_listView, &QListView::clicked, [&](const QModelIndex &index)
            {
            bool isChecked = index.model()->data(index, Qt::UserRole).toBool();
              m_listView->model()->setData(index, !isChecked, Qt::UserRole);
              m_listView->update(); });
  • model的datasetData函数

QVariant IconTextModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid() || index.row() >= m_data.count())
        return QVariant();

    switch (role)
    {
    case Qt::DecorationRole:
        return QIcon(m_data.at(index.row()).m_icon);
    case Qt::DisplayRole:
        return m_data.at(index.row()).m_name;
    case Qt::UserRole:
        return m_data.at(index.row()).m_isChecked;
    default:
        return QVariant();
    }
}

bool IconTextModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if (index.isValid() && role == Qt::UserRole)
    {
        m_data[index.row()].m_isChecked = value.toBool();
        emit dataChanged(index, index);
    }
    return true;
}

总结

  • 知识理应共享,源码在此。
  • 这个示例中的功能点,主要在于绘制函数的实现,要考虑怎么把原有qt的绘制屏蔽掉,关于数据处理的部分很简单

http://lihuaxi.xjx100.cn/news/2162055.html

相关文章

Element表格之表头合并、行合并和列合并

el-table合并表头handerMethod_el-table表头合并-CSDN博客 Element表格之表头合并、行合并和列合并_element表格表头合并-CSDN博客 一、合并表头 话不多说,先看效果图: 表格结构如上,其中:header-cell-style对表头做了一些处理。 headFirst…

运行时间比较

subprocess.run() 函数参数的含义: shell_command:这是要执行的命令。它可以是一个字符串,也可以是一个包含命令和参数的列表。例如,“ls -l” 或 [“ls”, “-l”]。shellTrue:这是一个布尔值参数,指示是…

人际关系与情景模拟

面试中的同事 1、着眼合作多理解 2、立足长远多承担 3、分工协作多沟通 4、相互学历促成长 面试中的领导 1、尊重领导权威 2、适应领导风格 3、服从领导安排 4、请示领导意见 5、完成领导任务 6、汇报工作结果 面试中的下属(面试考的很少,毕…

iPhone退出恢复模式的方法有哪些?iPhone用户必知的几种方法!

大家有没有遇到过类似的情况,苹果手机在进入恢复模式后,却发现怎么也退出不了,这是什么原因?iPhone手机恢复模式怎么退出? 无论是误按、系统故障,还是其他未知因素导致手机进入恢复模式,如何快速…

老师们怎么发布月考成绩

月考成绩的私密发布一直是老师们需要慎重对待的一项工作。要想高效、私密的将成绩反馈给学生和家长,工作量不容小觑,在以前没有那么多教学工具的时代,老师们基本都是手工记录成绩,然后在班级会议上逐一宣读,或者通过邮…

go routing 之 gorilla/mux

1. 背景 继续学习 go 2. 关于 routing 的学习 上一篇 go 用的库是:net/http ,这次我们使用官方的库 github.com/gorilla/mux 来实现 routing。 3. demo示例 package mainimport ("fmt""net/http""github.com/gorilla/mux&…

来盘点我的校园生活(3)

来公布上期数学题答案:12 你算对了吗? 今天我们班真是炸开了锅。事情是这样的,我今天早晨上学,学校不让早到,但我一个不小心早到了,主任的规定是尽量不早到,早到不扣分,倒要站在那儿背书&…

使用Python生成一束玫瑰花

520到了,没时间买花?我们来生成一个电子的。 Python不仅是一种强大的编程语言,用于开发应用程序和分析数据,它也可以用来创造美丽的艺术作品。在这篇博客中,我们将探索如何使用Python生成一束玫瑰花的图像。 准备工作…