简述

前面分享了QTableView中怎样加入复选框。

本节主要介绍QTableView中的表头-QHeaderView加入复选框的功能,以下以水平表头为例。垂直表头相似!

效果

QHeaderView

源代码

TableHeaderView::TableHeaderView(Qt::Orientation orientation, QWidget *parent)
: QHeaderView(orientation, parent),
m_bPressed(false),
m_bChecked(false),
m_bTristate(false),
m_bNoChange(false),
m_bMoving(false)
{
// setStretchLastSection(true);
setHighlightSections(false);
setMouseTracking(true); // 响应鼠标
setSectionsClickable(true);
} // 槽函数,用于更新复选框状态
void TableHeaderView::onStateChanged(int state)
{
if (state == Qt::PartiallyChecked) {
m_bTristate = true;
m_bNoChange = true;
} else {
m_bNoChange = false;
} m_bChecked = (state != Qt::Unchecked);
update();
} // 绘制复选框
void TableHeaderView::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 TableHeaderView::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 TableHeaderView::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 TableHeaderView::event(QEvent *event)
{
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);
}

接口说明

  • onStateChanged

    槽函数,与model关联。当model的数据发生变化时,表头复选中状态也随之变化。

  • paintSection

    绘制部分,主要用于绘制复选框,主要设置QStyleOptionButton的状态。然后通过QStyle的drawPrimitive绘制样式。

  • mousePressEvent

    鼠标按下表头,设置被按下的标志为true。

  • mouseReleaseEvent

    鼠标从表头释放。发送信号,更新model数据。

  • event

    鼠标滑过、离开。更新复选框状态。

QAbstractTableModel

源代码

源代码过多,这里仅仅贴更改部分及新增部分,其他部分请參考:Qt之QTableView加入复选框(QAbstractItemDelegate)

// 设置表格项数据
bool TableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (!index.isValid())
return false; int nColumn = index.column();
FileRecord record = m_recordList.at(index.row());
switch (role)
{
case Qt::DisplayRole:
{
if (nColumn == File_PATH_COLUMN)
{
record.strFilePath = value.toString(); m_recordList.replace(index.row(), record);
emit dataChanged(index, index);
return true;
}
}
case Qt::CheckStateRole:
case Qt::UserRole:
{
if (nColumn == CHECK_BOX_COLUMN)
{
record.bChecked = value.toBool(); m_recordList.replace(index.row(), record);
emit dataChanged(index, index); if (role == Qt::UserRole)
onStateChanged();
return true;
}
}
default:
return false;
}
return false;
} // 复选状态改变,通知表头更新复选状态
void TableModel::onStateChanged()
{
Qt::CheckState state = Qt::Unchecked;
int nCount = m_recordList.count();
int nSelectedCount = 0;
FileRecord record;
for (int i = 0; i < nCount; ++i)
{
record = m_recordList.at(i);
if (record.bChecked)
++nSelectedCount;
} if (nSelectedCount >= nCount)
{
state = Qt::Checked;
}
else if (nSelectedCount > 0)
{
state = Qt::PartiallyChecked;
} emit stateChanged(state);
} // 接收表头复选状态更新变化。改动表格复选状态
void TableModel::onStateChanged(int state)
{
QModelIndex index;
for (int i = 0; i < rowCount(); ++i)
{
index = this->index(i, CHECK_BOX_COLUMN);
setData(index, state == Qt::Checked, Qt::CheckStateRole);
}
}

接口说明

  • setData

    设置表格项数据,关键代码:当role为Qt::UserRole时候,会调用onStateChanged()函数,来更新表头!

  • onStateChanged

    复选状态改变,通知表头更新复选状态。

  • onStateChanged(int state)

    槽函数,接收表头复选状态更新变化,改动表格复选状态。

使用

这时,就须要将header与model的信号与槽关联起来,更新复选框状态了!

QTableView *pTableView = new QTableView(this);
TableModel *pModel = new TableModel(this);
TableHeaderView *pHeader = new TableHeaderView(Qt::Horizontal, this);
CheckBoxDelegate *pDelegate = new CheckBoxDelegate(this); pTableView->setHorizontalHeader(pHeader);
pTableView->setModel(pModel);
pTableView->setItemDelegate(pDelegate); connect(pModel, SIGNAL(stateChanged(int)), pHeader, SLOT(onStateChanged(int)));
connect(pHeader, SIGNAL(stateChanged(int)), pModel, SLOT(onStateChanged(int)));

Qt之QHeaderView加入复选框的更多相关文章

  1. Qt之QHeaderView添加复选框

    简述 前面分享了QTableView中如何添加复选框.本节主要介绍QTableView中的表头-QHeaderView添加复选框的功能,下面以水平表头为例,垂直表头类似! 简述 效果 QHeaderV ...

  2. Qt之QTableView添加复选框(QAbstractItemDelegate)

    简述 上节分享了使用自定义模型QAbstractTableModel来实现复选框.下面我们来介绍另外一种方式: 自定义委托-QAbstractItemDelegate. 简述 效果 QAbstract ...

  3. Qt之QTableView添加复选框(QAbstractTableModel)

    简述 使用QTableView,经常会遇到复选框,要实现一个好的复选框,除了常规的功能外,还应注意以下几点: 三态:不选/半选/全选 自定义风格(样式) 下面我们介绍一下常见的实现方式: 编辑委托. ...

  4. qt QTableView中嵌入复选框CheckBox 的四种方法总结

    第一种不能之前显示,必须双击/选中后才能显示,不适用. 第二种比较简单,通常用这种方法. 第三种只适合静态显示静态数据用 第四种比较适合扩展,它除了可以嵌入复选框,还可以通过paint()绘制其它控件 ...

  5. PyQt(Python+Qt)学习随笔:复选框checkBox的tristate属性

    在Qt Designer中,tristate属性是复选框checkBox相比较于QAbstractButton多出来的唯一属性. tristate属性表示复选框是三种状态还是两种状态,如果trista ...

  6. QTableWidget自定义表头QHeaderView加全选复选框

    1         QTableWidget自定义表头QHeaderView加全选复选框 在使用QTableWidget时需要在表头添加全选复选框,但是默认的表头无法添加复选框,只能用图片画上去一个复 ...

  7. Qt树形控件QTreeView使用1——节点的添加删除操作 复选框的设置

    QtreeView是ui中最常用的控件,Qt中QTreeWidget比QTreeView更简单,但没有QTreeView那么灵活(QTreeWidget封装的和MFC的CTreeCtrl很类似,没有m ...

  8. 组合框里添加复选框的方法(使用勾选的假象,用图片代替而已,并非QT原生支持)

    组合框可以看作是列表框和文本框的组合,因其占据的空间少,使用操作方便,常被界面设计人员用于界面开发设计中,在有限个输入的条件下,组合框常用来代替文本框,这样从用户使用角度来看,更趋人性化,所见即所得. ...

  9. 关于QT Graphics View开启OpenGL渲染后复选框、微调框等无法正常显示的问题

    之前学习QT Graphics View框架,除了基本的图元外,还可以通过QGraphicsProxyWidget类添加QT的基本Widget(如按钮.复选框.单选框等),常使用的场景类接口如下: Q ...

随机推荐

  1. vue-cli 脚手架目录结构说明

    目录结构截图如下 /build 编译配置文件目录,由脚手架自动生成 /config webpack 配置文件目录,由脚手架自动生成 /node_modules node依赖目录,可通过package. ...

  2. 前后端分手大师——MVVM 模式

    之前对 MVVM 模式一直只是模模糊糊的认识,正所谓没有实践就没有发言权,通过这两年对 Vue 框架的深入学习和项目实践,终于可以装B了有了拨开云雾见月明的感觉. 简而言之 Model–View–Vi ...

  3. axios在vue中的简单配置与使用

    一.axios 简介 axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征:https://hzzly.github.io/2017/03/12/ ...

  4. Java 面试题:百度前200页都在这里了

    基本概念 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 Java 的反射机制 什么是 ACID BS与CS的联系与区别 Cookie ...

  5. css基础-语法篇

    CSS基础 1.css简介 cascading style sheets    汉译层叠样式表,WEB标准中的表现标准语言,表现标准语言在网页中主要对网页信息的显示进行控制,简单说就是如何修饰网页信息 ...

  6. react native一键分享功能实现&原理和注意点(支持微信、qq、新浪微博等)

    目前手机使用的一键分享SDK比较主流的有两个:一个是ShareSDK,另一个是友盟分享. 又因为友盟功能比较多且比较全,比如说友盟统计.友盟推送等,所以本文重点介绍的是友盟分享功能在rn上的应用以及要 ...

  7. AutoCAD.net支持后台线程-Socket服务端

    最近因为公司项目的需求,CAD作为服务端在服务器中常驻运行,等待客户端远程发送执行任务的指令,最终确认用Socket-tcp通讯,CAD需要实时监听客户端发送的消息,这时就需要开启线程执行Socket ...

  8. SSE图像算法优化系列十二:多尺度的图像细节提升。

    无意中浏览一篇文章,中间提到了基于多尺度的图像的细节提升算法,尝试了一下,还是有一定的效果的,结合最近一直研究的SSE优化,把算法的步骤和优化过程分享给大家. 论文的全名是DARK IMAGE ENH ...

  9. python实现图片批量剪裁的程序

    from PIL import Image import os fin = 'D:/test' fout = 'D:/test2' for file in os.listdir(fin): file_ ...

  10. [读书笔记]javascript语言精粹'

    人比较笨,以前只做项目,案例,然而一些javascript的很多理论不知道该怎么描述,所以最近开启一波读书之旅: 标识符 1.定义 标识符以字母开头,可能后面跟上一个或多个字母.数字或者下划线. 2. ...