QTableView表头Header增加复选框Checkbox

news2024/9/29 5:27:05

原文出处:Qt 之 QHeaderView 添加复选框_qtableview添加复选框-CSDN博客 

这哥们只贴了部分代码,我还是把它弄好分享给大家吧

DTableHeaderView.h

#ifndef DTABLEHEADERVIEW_H
#define DTABLEHEADERVIEW_H

#include <QHeaderView>

class DTableHeaderView : public QHeaderView
{
    Q_OBJECT
public:
    DTableHeaderView(Qt::Orientation orientation, QWidget *parent);

signals:
    void stateChanged(int state);

public slots:
    void setStateChanged(int state);

protected:
    void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const;
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    bool event(QEvent *event);
private:
    bool m_bPressed = false;
    bool m_bChecked = false;
    bool m_bTristate = false;
    bool m_bNoChange = false;
    bool m_bMoving = false;

    const int CHECK_BOX_COLUMN = 0;


};

#endif // DTABLEHEADERVIEW_H

DTableHeaderView.cpp

#include "DTableHeaderView.h"
#include <QPainter>
#include <QCheckBox>
#include <QMouseEvent>


DTableHeaderView::DTableHeaderView(Qt::Orientation orientation, QWidget *parent)
    : QHeaderView(orientation, parent)
{
    // setStretchLastSection(true);
    setHighlightSections(false);
    setMouseTracking(true);

    // 响应鼠标
    setSectionsClickable(true);
}

// 槽函数,用于更新复选框状态
void DTableHeaderView::setStateChanged(int state)
{
    if (state == Qt::PartiallyChecked)
    {
        m_bTristate = true;
        m_bNoChange = true;
    }
    else
    {
        m_bNoChange = false;
    }

    m_bChecked = (state != Qt::Unchecked);
    update();
}

// 绘制复选框
void DTableHeaderView::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
{
    painter->save();
    QHeaderView::paintSection(painter, rect, logicalIndex);
    painter->restore();

    if (logicalIndex == CHECK_BOX_COLUMN)
    {
        QStyleOptionButton option;
        option.initFrom(this);

        if (m_bChecked)
            option.state |= QStyle::State_Sunken;

        if (m_bTristate && m_bNoChange)
            option.state |= QStyle::State_NoChange;
        else
            option.state |= m_bChecked ? QStyle::State_On : QStyle::State_Off;
        if (testAttribute(Qt::WA_Hover) && underMouse())
        {
            if (m_bMoving)
                option.state |= QStyle::State_MouseOver;
            else
                option.state &= ~QStyle::State_MouseOver;
        }

        QCheckBox checkBox;
        option.iconSize = QSize(20, 20);
        option.rect = rect;
        style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &option, painter, &checkBox);
        //style()->drawItemPixmap(painter, rect, Qt::AlignCenter, QPixmap(":/images/checkBoxChecked"));
        //style()->drawControl(QStyle::CE_CheckBox, &option, painter, this);
    }
}

// 鼠标按下表头
void DTableHeaderView::mousePressEvent(QMouseEvent *event)
{
    int nColumn = logicalIndexAt(event->pos());
    if ((event->buttons() & Qt::LeftButton) && (nColumn == CHECK_BOX_COLUMN))
    {
        m_bPressed = true;
    }
    else
    {
        QHeaderView::mousePressEvent(event);
    }
}

// 鼠标从表头释放,发送信号,更新model数据
void DTableHeaderView::mouseReleaseEvent(QMouseEvent *event)
{
    if (m_bPressed)
    {
        if (m_bTristate && m_bNoChange)
        {
            m_bChecked = true;
            m_bNoChange = false;
        }
        else
        {
            m_bChecked = !m_bChecked;
        }

        update();

        Qt::CheckState state = m_bChecked ? Qt::Checked : Qt::Unchecked;

        emit stateChanged(state);
    }
    else
    {
        QHeaderView::mouseReleaseEvent(event);
    }

    m_bPressed = false;
}

// 鼠标滑过、离开,更新复选框状态
bool DTableHeaderView::event(QEvent *event)
{
    updateSection(0); // 很关键,不然checkbox刷新有延迟!

    if (event->type() == QEvent::Enter || event->type() == QEvent::Leave)
    {
        QMouseEvent *pEvent = static_cast<QMouseEvent *>(event);
        int nColumn = logicalIndexAt(pEvent->x());
        if (nColumn == CHECK_BOX_COLUMN)
        {
            m_bMoving = (event->type() == QEvent::Enter);

            update();
            return true;
        }
    }

    return QHeaderView::event(event);
}

 MainWindow.cpp

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include "DTableHeaderView.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);


    m_pMode = new QStandardItemModel(this);
    ui->tableView->setModel(m_pMode);
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection); //设置选择模式,选择单行
    ui->tableView->verticalHeader()->setVisible(false);
    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); // Qt QTableView数据列宽度自适应, 横向填满表格

    QStringList strHeaders;
    strHeaders.append("");
    strHeaders.append(tr("列2"));
    strHeaders.append(tr("列3"));
    m_pMode->setColumnCount(strHeaders.size());
    m_pMode->setHorizontalHeaderLabels(strHeaders);


    // 创建自定义的表头,并将其设置为表头视图
    DTableHeaderView *header = new DTableHeaderView(Qt::Horizontal, ui->tableView);
    ui->tableView->setHorizontalHeader(header);

    QObject::connect(header, &DTableHeaderView::stateChanged, [=](int checked)
    {
        // 在这里处理复选框状态变化的逻辑
        qDebug() << "CheckBox is" << (checked ? "checked" : "unchecked");
    });


    m_pMode->setRowCount(4);
    for (int row = 0; row < m_pMode->rowCount(); ++row)
    {
        for (int col = 0; col < m_pMode->columnCount(); ++col)
        {
            QModelIndex index = m_pMode->index(row, col);
            m_pMode->setData(index, "Row " + QString::number(row) + ", Column " + QString::number(col));
        }
    }
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    ((DTableHeaderView *)ui->tableView->horizontalHeader())->setStateChanged(Qt::PartiallyChecked);
}

void MainWindow::on_pushButton_2_clicked()
{
    ((DTableHeaderView *)ui->tableView->horizontalHeader())->setStateChanged(Qt::Checked);
}

void MainWindow::on_pushButton_3_clicked()
{
    ((DTableHeaderView *)ui->tableView->horizontalHeader())->setStateChanged(Qt::Unchecked);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1235513.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Sql】sql server还原数据库的时候,提示:因为数据库正在使用,所以无法获得对数据库的独占访问权。

【问题描述】 sql server 还数据库的时候&#xff0c;提示失败。 点击左下角进度位置&#xff0c;可以得到详细信息&#xff1a; 因为数据库正在使用&#xff0c;所以无法获得对数据库的独占访问权。 【解决方法】 针对数据库先后执行下述语句&#xff0c;获得独占访问权后&a…

Cypress环境变量

Cypress环境变量 baseUrl 当你配置了 baseUrl &#xff0c;测试套件中的 cy.visit() 、 cy.request() 都会自动以 baseUrl 的值作为前缀并且&#xff0c;当你需要访问某些网址或者发起接口请求时&#xff0c;在代码中就可以不用再指定请求的 host 或者 url 了 如何配置 base…

安装向量数据库milvus及其Attu

前置条件安装docker compose 在宿主机上创建文件目录 mkdir -p /home/sunyuhua/milvus/db mkdir -p /home/sunyuhua/milvus/conf mkdir -p /home/sunyuhua/milvus/etcd下载docker-compose.yml wget https://github.com/milvus-io/milvus/releases/download/v2.2.11/milvus-s…

树与二叉树堆:树

目录 树&#xff1a; 树的概念&#xff1a; 树的相关概念&#xff1a; 1、结点的度&#xff1a; 2、叶节点&#xff1a;度为0的节点 3、非终端节点或分支节点&#xff1a; 4、父节点和子节点&#xff1a; 5、兄弟节点&#xff1a; 6、树的度&#xff1a; 7、树的层次或…

电脑监控系统是如何支持远程监控的?

电脑监控系统支持远程监控的方式有多种&#xff0c;以下是其中几种常见的方法&#xff1a; 远程桌面协议 这是一种常见的远程监控协议&#xff0c;它允许用户通过互联网远程访问和控制被监控的电脑。RDP是一种加密的协议&#xff0c;可以保证数据传输的安全性和隐私性。使用RD…

人性化的微距LED显示屏备受欢迎

近年来&#xff0c;微距LED显示屏市场需求不断攀升&#xff0c;尤其是LED显示屏厂商不断推陈出新的COB和Mini LED封装技术&#xff0c;价格逐渐趋于亲民。随着智慧城市的崛起&#xff0c;微距LED显示屏成为市场上备受瞩目的热门产品。伴随LED显示屏厂商不断升级产品&#xff0c…

对象方法总结-遍历

遍历对象&#xff1a; // 以对象 { protokey: proto-key } 作为原型创建一个新对象 let obj Object.create({protoKey: proto-key }); // 给新对象自身添加属性 obj.user ostuthere; obj.age 20; obj.gender female; // 添加Symbol属性 obj[Symbol(mother)] user1; obj[S…

苍穹外卖遇到的问题—员工分页查询

项目场景&#xff1a; 系统中的员工很多的时候&#xff0c;如果在一个页面中全部展示出来会显得比较乱&#xff0c;不便于查看&#xff0c;所以一般的系统中都会以分页的方式来展示列表数据。而在我们的分页查询页面中, 除了分页条件以外&#xff0c;还有一个查询条件 “员工姓…

共享内存的创建和映射过程

消息队列、共享内存、信号量的机制&#xff1a;它们在使用之前都要生成 key&#xff0c;然后通过 key 得到唯一的 id&#xff0c;并且都是通过 xxxget 函数。在内核里面&#xff0c;这三种进程间通信机制是使用统一的机制管理起来的&#xff0c;都叫 ipcxxx。为了维护这三种进程…

fractional Brownian Motion driven stochastic integrals

See https://mathoverflow.net/questions/304366/fractional-brownian-motion-driven-stochastic-integrals

深入解析Windows操作系统——概念和工具

文章目录 Windows操作系统的版本Windows NT和Windows 95基础概念和术语内核调试用户模式调试 Windows操作系统的版本 Windows NT和Windows 95 Windows NT和Windows 95之间的一些结构性差异&#xff0c;以及Windows NT优于Windows 95及其后续版本的一些方面&#xff1a; Wind…

计数排序+桶排序 详讲(思路+图解+代码详解)

文章目录 计数排序和桶排序一、计数排序概念&#xff1a;写法一&#xff1a;写法二&#xff1a; 二、桶排序概念代码 计数排序和桶排序 一、计数排序 时间复杂度&#xff1a;空间复杂度&#xff1a;稳定性&#xff1a;稳定 概念&#xff1a; 非基于比较的排序 计数排序又称为…

Django批量插入数据及分页器

文章目录 一、批量插入数据二、分页1.分页器的思路2.用一个案例试试3.自定义分页器 一、批量插入数据 当我们需要大批量创建数据的时候&#xff0c;如果一条一条的去创建或许需要猴年马月 我们可以先试一试for循环试试 我们首先建立一个模型类来创建一个表 models.py&#xff…

【图像分类】【深度学习】【Pytorch版本】Inception-ResNet模型算法详解

【图像分类】【深度学习】【Pytorch版本】Inception-ResNet模型算法详解 文章目录 【图像分类】【深度学习】【Pytorch版本】Inception-ResNet模型算法详解前言Inception-ResNet讲解Inception-ResNet-V1Inception-ResNet-V2残差模块的缩放(Scaling of the Residuals)Inception-…

3.基于多能互补的热电联供微网优化运行复现(matlab代码)

0.代码链接 基于多能互补的热电联供微电网/综合能源系统优化运行&#xff08;Matlab程序Yalmip&#xff0b;Cplex求解&#xff09;_工业综合能源系统资源-CSDN文库 2. 主要内容&#xff1a;代码主要做的是多能互补的热电联供型微网优化运行模型&#xff0c;在需求侧对负荷类型…

视频集中存储EasyCVR平台使用海康SDK,播放出现串流情况是什么原因?

视频监控平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码H.264、平台级联等。为了便于用户二次开发、调用与集成&#xff0c;我…

如何入驻抖音本地生活服务商,附上便捷流程!

抖音作为一款短视频社交媒体应用&#xff0c;已经成为全球范围内数以亿计的用户的首选。而在普及的同时&#xff0c;短视频领域也在不断拓展自身的业务领域&#xff0c;其中之一就是本地生活服务。继抖音本地生活服务之后支付宝、视频号也相继开展了本地生活服务&#xff0c;用…

HP惠普暗影精灵7Plus笔记本OMEN 17.3英寸游戏本17-ck0000恢复原厂Windows11预装OEM系统

链接&#xff1a;https://pan.baidu.com/s/1ukMXI2V3D0c-kVmIQSkbYQ?pwd2rbr 提取码&#xff1a;2rbr hp暗影7P原厂WIN11系统适用型号&#xff1a; 17-ck0056TX&#xff0c; 17-ck0055TX&#xff0c; 17-ck0054TX &#xff0c;17-ck0059TX 自带所有驱动、出厂时主题壁纸、…

Oracle实时同步技术

Oracle数据库的价值 Oracle数据库是一种高度可靠、安全和强大的关系型数据库管理系统&#xff0c;它具有以下几个方面的价值&#xff1a; 可靠性和稳定性&#xff1a;Oracle数据库以其高度可靠性、稳定性和数据完整性而闻名于世。 安全性&#xff1a;Oracle数据库提供了一系列…

安装gitlab

安装gitlab 环境 关闭防火墙以及selinux&#xff0c;起码4核8G 内存至少 3G 不然启动不了 下载环境 gitlab官网&#xff1a;GitLab下载安装_GitLab最新中文基础版下载安装-极狐GitLab rpm包下载地址&#xff1a; [Yum - Nexus Repository Manager (gitlab.cn)](https://pack…