列表标题栏添加CheckBox(自定义HanderView的时候实现)
前段时间项目上的要求,要实现一个列表(见下图1)。类似网页上的列表,可以通过选中标题栏的复选框,实现全选或者全不选的功能。但是看了很久,都没看到Qt哪个方法可以实现在标题栏添加控件。
图1
要实现这样的效果,也许我们首先想到的,就是直接生成一个CheckBox,用setGeometry()设置它的位置就可以了。当然这样是可以的,也是最简单的。但是有个问题:这样做,CheckBox就固定死了,而且没有跟标题栏连城一体,不会随着标题栏一起移动。结果如下图2
显然,这样的效果有点不爽。
后面想到了一种比较好的办法,就是自定义一个heander。通过setHeader()设置给列表。下面是我的部分实现代码
- class MyCheckBox:public QCheckBox
- {
- Q_OBJECT
- public:
- MyCheckBox(QWidget *parent /*= NULL*/):QCheckBox(parent)
- {
- }
- ~MyCheckBox(){}
- protected:
- void mouseMoveEvent(QMouseEvent *e)
- {
- //HeaderView::mouseMoveEvent(e);
- QRect boxRect = this->rect();
- QPoint pos = e->pos();
- if (boxRect.contains(pos))
- {
- setCursor(Qt::ArrowCursor);
- }
- }
- private:
- };
- class HanderView :public QHeaderView
- {
- Q_OBJECT
- public:
- HanderView( Qt::Orientation orientation,QWidget *parent /*= NULL*/):QHeaderView(orientation,parent)
- {
- m_pCheckBox = new MyCheckBox(this);
- hasPaint = false;
- }
- ~HanderView()
- {
- }
- private slots:
- protected:
- void resizeEvent(QResizeEvent *event)
- {
- int leftPos = this->sectionViewportPosition(0);
- m_pCheckBox->setGeometry(leftPos + 5,0,50,this->height());
- int sectionMinSize = 50;
- this->setMinimumSectionSize(sectionMinSize + sectionSizeFromContents(0).width());
- this->setDefaultSectionSize(sectionMinSize + sectionSizeFromContents(0).width());
- }
- void paintEvent(QPaintEvent *e)
- {
- QHeaderView::paintEvent(e);
- int leftPos = this->sectionViewportPosition(0);
- m_pCheckBox->setGeometry(leftPos + 5,0,50,this->height());
- }
- private:
- MyCheckBox *m_pCheckBox;
- bool hasPaint;
- };
- class MyTreeWidget:public QTreeWidget
- {
- Q_OBJECT
- public:
- MyTreeWidget(QWidget *parent = NULL);
- ~MyTreeWidget();
- protected:
- private:
- HanderView *m_pHeader;
- };
- MyTreeWidget::MyTreeWidget(QWidget *parent /* = NULL */):QTreeWidget(parent)
- {
- m_pHeader = new HanderView(Qt::Horizontal,parent);
- this->setHeader(m_pHeader);
- QStringList list ;
- list<<"文件名"<<"文件大小"<<"文件类型"<<"创建日期";
- this->setHeaderLabels(list);
- header()->setDefaultAlignment(Qt::AlignCenter);
- }
1、这里是为了保证鼠标在标题栏上是箭头状,因为Box靠近分割线,不这么做的话,鼠标移动到Box上面的时候也可能是Qt::SplitHCursor。这样对用户感觉有点不爽。大家可以试试注释这些代码看看就知道了
- void mouseMoveEvent(QMouseEvent *e)
- {
- //HeaderView::mouseMoveEvent(e);
- QRect boxRect = this->rect();
- QPoint pos = e->pos();
- if (boxRect.contains(pos))
- {
- setCursor(Qt::ArrowCursor);
- }
2、
- int leftPos = this->sectionViewportPosition(0);
- m_pCheckBox->setGeometry(leftPos + 5,0,50,this->height());
- int sectionMinSize = 50;
- this->setMinimumSectionSize(sectionMinSize + sectionSizeFromContents(0).width());
- this->setDefaultSectionSize(sectionMinSize + sectionSizeFromContents(0).width());
设置列的最小宽度。
- sectionSizeFromContents(0).width()这个可以根据标题栏的字符的长度调整列的宽度。
3、
- int leftPos = this->sectionViewportPosition(0);
- m_pCheckBox->setGeometry(leftPos + 5,0,50,this->height());
这里保证移动滚动条的时候,Box会跟着标题栏动。
效果如图3,图4
图3 图4
4、我们也可以把Box放在其他列,改一下index就可以了
- int leftPos = this->sectionViewportPosition(1);
- m_pCheckBox->setGeometry(leftPos + 5,0,50,this->height());
- int sectionMinSize = 50;
- this->setMinimumSectionSize(sectionMinSize + sectionSizeFromContents(1).width());
- this->setDefaultSectionSize(sectionMinSize + sectionSizeFromContents(1).width());
- int leftPos = this->sectionViewportPosition(1);
- m_pCheckBox->setGeometry(leftPos + 5,0,50,this->height());
结果如图5,图6
图5 图6
http://blog.csdn.net/hai200501019/article/details/9150691
列表标题栏添加CheckBox(自定义HanderView的时候实现)的更多相关文章
- 每日学习心得:SharePoint 2013 自定义列表项添加Callout菜单项、文档关注、SharePoint服务端对象模型查询
前言: 前一段时间一直都比较忙,没有什么时间进行总结,刚好节前项目上线,同时趁着放假可以好好的对之前遇到的一些问题进行总结.主要内容有使用SharePoint服务端对象模型进行查询.为SharePoi ...
- ArcGIS中添加进自定义的ttf字符标记符号
原文:ArcGIS中添加进自定义的ttf字符标记符号 ArcGIS系统中的样式可能不能满足实际生产需要,为了实现快速制图,可自定义一些样式,以便重复利用. 1. 制作的符号库 使用 FontCre ...
- 为Windows窗口标题栏添加新按钮
为Windows窗口标题栏添加新按钮 对于我们熟悉的标准windows窗口来讲,标题栏上一般包含有3个按钮,即最大化按钮,最小化按钮和关闭按钮.你想不想在Windows的窗口标题栏上添加一个新的自 ...
- wpf中为DataGrid添加checkbox支持多选全选
项目中用到DataGrid, 需要在第一列添加checkbox, 可以多选.全选. 其中涉及的概念DataTemplate, DataGridCellStyle, DataGridCellContro ...
- [PHP] JQuery+Layer实现添加删除自定义标签代码
JQuery+Layer实现添加删除自定义标签代码 实现效果如下: 实现代码如下: <!doctype html> <html> <head> <meta c ...
- Jquery动态在td中添加checkbox
如图:想要在这个id为headId的<td>中,用jquery动态添加checkbox 代码如下 : data是我用ajax 从后台获取的数据,里面含有若干个user类,我想把所有的人名字 ...
- DataGridView 中添加CheckBox和常用处理方式 .
DataGridView 中添加CheckBox和常用处理方式 文章1 转载:http://blog.csdn.net/pinkey1987/article/details/5267934 DataG ...
- DataGridView中添加CheckBox列用于选择行
DataGridView中添加CheckBox列用于选择行 1,编辑DataGridView,添加一列 CheckBox ,Name 赋值为 "select",如下图: 2,取消 ...
- 给C#的treeview控件的部分节点添加checkbox
一.先初始化treeview this.treeView1.CheckBoxes = true; this.treeView1.ShowLines = false; this.treeView1.Dr ...
随机推荐
- asp.NET配置
添加用户 1.选择创建用户 2 可以使用网站管理工具来管理应用程序的所有安全设置.可以设置用户和密码(身份验证),可以创建角色(用户组),还可以创建权限(用于控制对应用程序各个部分的访问的规则). ...
- 实现AJAX局部刷新以及PageMethod方法的使用
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...
- 阿里Android一面(校招)
4.8号晚上8点多接到了阿里一面的电话,面试官人很好,和我聊了半个多小时.我面的是无线事业部,就是做淘宝客户端的那个部门.面试问的都很基础,刚开始问了hashmap和快速排序.接着就是问Android ...
- Android滑动事件冲突
首先,我们假设这样一个场景:一个ViewPager里面嵌套一个ViewPager,内部滑动方向和外部滑动方向一样时,该怎么解决这一冲突呢? 针对滑动冲突这里给出两种解决方案:外部拦截法,内部拦截法. ...
- HTML之表格与表单
一.表格(table/tr/td) <table></table>表格 --不设高度 width:宽度.可以用像素或百分比表示. 常用960像素. border:边框,常用值为 ...
- C#直接插入排序
以Int类型数组为举例 namespace 直接插入排序 { class Program { private static void Insert(int[] arrayList) { bool is ...
- OC-nonatomic和atomic相关
1.原子和非原子属性1.1>OC在定义属性时又nonatomic和atomic两种选择(1)atomic:原子属性,为setter方法加锁(默认就是atomic)(2)nonatomic:非原子 ...
- vagrant 入门3
创建第一个Vagrant虚拟环境以及工程(续集): (8) Provisioning: 通常情况下Box只做最基本的设置,而不是一次到位的设置好所有的环境.Vagrant通常使用chef或者Puppe ...
- Python3 官方文档翻译 - 4.7 函数定义
4.7.1 默认函数定义 最常用的就是为一个或多个参数设定默认值,这让函数可以用比定义时更少的参数来调用,例如: def ask_ok(prompt, retries=4, complaint='Ye ...
- Codeforces Round #246 (Div. 2)
题目链接:Codeforces Round #246 (Div. 2) A:直接找满足的人数,然后整除3就是答案 B:开一个vis数组记录每一个衣服的主场和客场出现次数.然后输出的时候主场数量加上反复 ...