前段时间项目上的要求,要实现一个列表(见下图1)。类似网页上的列表,可以通过选中标题栏的复选框,实现全选或者全不选的功能。但是看了很久,都没看到Qt哪个方法可以实现在标题栏添加控件。

图1

要实现这样的效果,也许我们首先想到的,就是直接生成一个CheckBox,用setGeometry()设置它的位置就可以了。当然这样是可以的,也是最简单的。但是有个问题:这样做,CheckBox就固定死了,而且没有跟标题栏连城一体,不会随着标题栏一起移动。结果如下图2

显然,这样的效果有点不爽。

后面想到了一种比较好的办法,就是自定义一个heander。通过setHeader()设置给列表。下面是我的部分实现代码

  1. class MyCheckBox:public QCheckBox
  2. {
  3. Q_OBJECT
  4. public:
  5. MyCheckBox(QWidget *parent /*= NULL*/):QCheckBox(parent)
  6. {
  7. }
  8. ~MyCheckBox(){}
  9. protected:
  10. void mouseMoveEvent(QMouseEvent *e)
  11. {
  1. //HeaderView::mouseMoveEvent(e);
  2. QRect boxRect = this->rect();
  3. QPoint pos = e->pos();
  4. if (boxRect.contains(pos))
  5. {
  6. setCursor(Qt::ArrowCursor);
  7. }
  8. }
  9. private:
  10. };
  11. class HanderView :public QHeaderView
  12. {
  13. Q_OBJECT
  14. public:
  15. HanderView( Qt::Orientation orientation,QWidget *parent /*= NULL*/):QHeaderView(orientation,parent)
  16. {
  17. m_pCheckBox = new MyCheckBox(this);
  18. hasPaint = false;
  19. }
  20. ~HanderView()
  21. {
  22. }
  23. private slots:
  24. protected:
  25. void resizeEvent(QResizeEvent *event)
  26. {
  27. int leftPos = this->sectionViewportPosition(0);
  28. m_pCheckBox->setGeometry(leftPos + 5,0,50,this->height());
  29. int sectionMinSize = 50;
  30. this->setMinimumSectionSize(sectionMinSize + sectionSizeFromContents(0).width());
  31. this->setDefaultSectionSize(sectionMinSize + sectionSizeFromContents(0).width());
  32. }
  33. void paintEvent(QPaintEvent *e)
  34. {
  35. QHeaderView::paintEvent(e);
  36. int leftPos = this->sectionViewportPosition(0);
  37. m_pCheckBox->setGeometry(leftPos + 5,0,50,this->height());
  38. }
  39. private:
  40. MyCheckBox   *m_pCheckBox;
  41. bool hasPaint;
  42. };
  1. class MyTreeWidget:public QTreeWidget
  2. {
  3. Q_OBJECT
  4. public:
  5. MyTreeWidget(QWidget *parent = NULL);
  6. ~MyTreeWidget();
  7. protected:
  8. private:
  9. HanderView   *m_pHeader;
  10. };
  1. MyTreeWidget::MyTreeWidget(QWidget *parent /* = NULL */):QTreeWidget(parent)
  2. {
  3. m_pHeader = new HanderView(Qt::Horizontal,parent);
  4. this->setHeader(m_pHeader);
  5. QStringList list ;
  6. list<<"文件名"<<"文件大小"<<"文件类型"<<"创建日期";
  7. this->setHeaderLabels(list);
  8. header()->setDefaultAlignment(Qt::AlignCenter);
  9. }

1、这里是为了保证鼠标在标题栏上是箭头状,因为Box靠近分割线,不这么做的话,鼠标移动到Box上面的时候也可能是Qt::SplitHCursor。这样对用户感觉有点不爽。大家可以试试注释这些代码看看就知道了

  1. void mouseMoveEvent(QMouseEvent *e)
  2. {
  1. //HeaderView::mouseMoveEvent(e);
  2. QRect boxRect = this->rect();
  3. QPoint pos = e->pos();
  4. if (boxRect.contains(pos))
  5. {
  6. setCursor(Qt::ArrowCursor);
  7. }

2、

  1. int leftPos = this->sectionViewportPosition(0);
  2. m_pCheckBox->setGeometry(leftPos + 5,0,50,this->height());
  3. int sectionMinSize = 50;
  4. this->setMinimumSectionSize(sectionMinSize + sectionSizeFromContents(0).width());
  5. this->setDefaultSectionSize(sectionMinSize + sectionSizeFromContents(0).width());

设置列的最小宽度。

  1. sectionSizeFromContents(0).width()这个可以根据标题栏的字符的长度调整列的宽度。

3、

  1. int leftPos = this->sectionViewportPosition(0);
  2. m_pCheckBox->setGeometry(leftPos + 5,0,50,this->height());

这里保证移动滚动条的时候,Box会跟着标题栏动。

效果如图3,图4

图3                                                                                              图4

4、我们也可以把Box放在其他列,改一下index就可以了

  1. int leftPos = this->sectionViewportPosition(1);
  2. m_pCheckBox->setGeometry(leftPos + 5,0,50,this->height());
  3. int sectionMinSize = 50;
  4. this->setMinimumSectionSize(sectionMinSize + sectionSizeFromContents(1).width());
  5. this->setDefaultSectionSize(sectionMinSize + sectionSizeFromContents(1).width());
  1. int leftPos = this->sectionViewportPosition(1);
  2. m_pCheckBox->setGeometry(leftPos + 5,0,50,this->height());

结果如图5,图6

图5                                                                                                                                        图6

http://blog.csdn.net/hai200501019/article/details/9150691

列表标题栏添加CheckBox(自定义HanderView的时候实现)的更多相关文章

  1. 每日学习心得:SharePoint 2013 自定义列表项添加Callout菜单项、文档关注、SharePoint服务端对象模型查询

    前言: 前一段时间一直都比较忙,没有什么时间进行总结,刚好节前项目上线,同时趁着放假可以好好的对之前遇到的一些问题进行总结.主要内容有使用SharePoint服务端对象模型进行查询.为SharePoi ...

  2. ArcGIS中添加进自定义的ttf字符标记符号

    原文:ArcGIS中添加进自定义的ttf字符标记符号 ArcGIS系统中的样式可能不能满足实际生产需要,为了实现快速制图,可自定义一些样式,以便重复利用. 1.   制作的符号库 使用 FontCre ...

  3. 为Windows窗口标题栏添加新按钮

    为Windows窗口标题栏添加新按钮   对于我们熟悉的标准windows窗口来讲,标题栏上一般包含有3个按钮,即最大化按钮,最小化按钮和关闭按钮.你想不想在Windows的窗口标题栏上添加一个新的自 ...

  4. wpf中为DataGrid添加checkbox支持多选全选

    项目中用到DataGrid, 需要在第一列添加checkbox, 可以多选.全选. 其中涉及的概念DataTemplate, DataGridCellStyle, DataGridCellContro ...

  5. [PHP] JQuery+Layer实现添加删除自定义标签代码

    JQuery+Layer实现添加删除自定义标签代码 实现效果如下: 实现代码如下: <!doctype html> <html> <head> <meta c ...

  6. Jquery动态在td中添加checkbox

    如图:想要在这个id为headId的<td>中,用jquery动态添加checkbox 代码如下 : data是我用ajax 从后台获取的数据,里面含有若干个user类,我想把所有的人名字 ...

  7. DataGridView 中添加CheckBox和常用处理方式 .

    DataGridView 中添加CheckBox和常用处理方式 文章1 转载:http://blog.csdn.net/pinkey1987/article/details/5267934 DataG ...

  8. DataGridView中添加CheckBox列用于选择行

    DataGridView中添加CheckBox列用于选择行 1,编辑DataGridView,添加一列 CheckBox ,Name 赋值为 "select",如下图: 2,取消 ...

  9. 给C#的treeview控件的部分节点添加checkbox

    一.先初始化treeview this.treeView1.CheckBoxes = true; this.treeView1.ShowLines = false; this.treeView1.Dr ...

随机推荐

  1. Win7/8在用账户密码登录时, 设置成保留用户名, 只输入密码

    修改注册表, 0表示保留用户名. 1表示每次都需要输入用户名密码. 位置: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersio ...

  2. python2.5_1.5_通过指定的端口和协议找到服务名

    代码如下: # -*- coding: utf-8 -*- import socket def find_service_name(): protocolname = 'tcp' for port i ...

  3. 转: requirejs中文api (详细)

    RequireJS的目标是鼓励代码的模块化,它使用了不同于传统<script>标签的脚本加载步骤.可以用它来加速.优化代码,但其主要目的还是为了代码的模块化.它鼓励在使用脚本时以modul ...

  4. Mac平台编译mupdf-qt的开源项目

    How to compile mupdf-qt Compile on Linux Install tools and thirdparty libraries You should install s ...

  5. IT第三天 - 数据类型、转换、Scanner使用

    IT第三天 上午 变量类型 1.6种数值类型:byte.short.int.long.float.double:其中byte是8个字节,short是16字节,int是32字节.long是64字节:日常 ...

  6. BZOJ 1677: [Usaco2005 Jan]Sumsets 求和

    题目 1677: [Usaco2005 Jan]Sumsets 求和 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 617  Solved: 344[Su ...

  7. [置顶] mybatis批量新增系列之有主键的表的批量新增

    前面介绍了无主键的表的批量插入,文章地址:http://blog.csdn.net/zhouxiaoyun0228/article/details/9980181 但是在开发中往往许多的表是需要主键的 ...

  8. @Autowired与@Resource的差别

    1.@Autowired与@Resource都能够用来装配bean. 都能够写在字段上,或写在setter方法上. 2.@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必 ...

  9. android 项目中使用到的网络请求框架以及怎样配置好接口URL

    我们在做项目中一定少不了网络请求,如今非常多公司的网络请求这块好多都是使用一些比較好的开源框架,我项目中使用的是volley,如今讲讲一些volley主要的使用,假设想要具体的了解就要去看它的源代码了 ...

  10. Service初步了解

    1.Service什么 Service它是一个应用程序组件,Android其中的四个核心组件之间 Service没有图形界面 通过经常使用来处理一些比较长耗时的操作 可以使用Service更新Cont ...