组合框可以看作是列表框和文本框的组合,因其占据的空间少,使用操作方便,常被界面设计人员用于界面开发设计中,在有限个输入的条件下,组合框常用来代替文本框,这样从用户使用角度来看,更趋人性化,所见即所得。然好的控件永远敢不上应用的步伐,有时常规控件并不能满足应用的需要,经常需要在现有的控件上做扩展。有些应用需要在组合框的列表框的每一项前加复选框,以便可以控制列表框每一项的状态(选中还是未选中),显然现有的组合框(列表框+文本框的组合)不能满足应用要求。那么怎么得到一个超强组合框(列表框+文本框+复选框的组合)呢?这种组合框既要有一般组合框的功能,又要有复选框的功能。接下来,我将介绍一种在组合框里添加复选框的方法:

先贴出图,让大家一睹为快,接下来介绍下它的实现方式,首先看看QComboBox增加项的方法:

void addItem(const QIcon &icon, const QString &text, const QVariant &userData = QVariant()) 

第一个参数在项的前面加图片,第二个参数是项的名字,第三个参数可以给项一个私有数据,如保存项的状态。

从addItem方法,第一个参数可以在项前添加图片,第三个参数可以保存项的状态,那么我们可以准备两幅图片,1幅是没打钩的复选框,1幅是打钩的复选框,用第三个参数来保存复选框的状态,当第三个参数的状态为选择的状态时,显示打勾的复选框,否则显示不打钩的复选框。看起来这种方法可行,不过要实现复选框功能,还的解决以下几个问题:

1.当鼠标单击复选框图片时,需要计算鼠标是单击了那一项

2.确定了单击的项后,还要能取出该项的状态(通过addItem的第三个参数设置的状态)

3.再根据项的状态,更新该项的图标,并且更改该项的状态

前面3点实现后,复选框的基本功能就实现了,当鼠标在复选框上单击时,复选框的图标就会改变,若之前是选中状态,则单击后变为非选中状态,若之前是非选中状态,则单击后变为选中状态。但是还没有完,这样的复选框还是个中看不中用的复选框,还需要给外界提供一个接口,当复选框状态改变了,要提供1个通知接口,要不然使用该控件的用户就必须定时轮询所有的复选框的状态了,很显然这不是一个好的设计。

4.当项状态改变了,还要能对外提供1个项状态改变的接口。

有了上面的思路,下面来看看实现:

头文件
#ifndef _CHECK_COMBOX_H
#define _CHECK_COMBOX_H#include <qcombobox.h>
class CCheckCombox : public QComboBox
{Q_OBJECT
public:CCheckCombox(QWidget *parent = NULL);void appendItem(const QString &text, bool bChecked);void hidePopup();protected:void mousePressEvent(QMouseEvent *e);signals:void checkedStateChange(int index, bool bChecked);private:void updateIndexStatus(int index);};
#endif

我们定义了1个类CCheckCombox,派生自QComboBox。通过appendItem来给组合框增加项;hidePopup是QComboBox的虚函数,该函数实现组合框的列表框隐藏,我们的目的是,当鼠标单击列表项前的复选框时,不让列表框隐藏,只更改复选的图标,所以需要重载hidePopup;mousePressEvent 是鼠标单击事件, 这也是父类的的虚函数,重载它是为了确定鼠标是否单击了复选框,单击了就要更改复选框状态;updateIndexStatus大家应该猜到了,该函数就是实现更改项的状态的函数;checkedStateChange这是一个信号,负责在项状态改变的时候,发送项状态改变信号,提供给外界一个应用接口。下面我们来看看实现:

源文件
#include "checkcombox.h"
#include <QMouseEvent>
#include <qdebug.h>
#include <qabstractitemview.h>
CCheckCombox::CCheckCombox(QWidget *parent) : QComboBox(parent)
{}void CCheckCombox::appendItem(const QString &text, bool bChecked)
{QIcon icon;if (bChecked)icon.addFile(":/check.png");elseicon.addFile(":/uncheck.png");addItem(icon, text, bChecked);
}void CCheckCombox::updateIndexStatus(int index)
{bool bChecked = itemData(index).toBool();if (bChecked)setItemIcon(index, QIcon(":/uncheck.png"));elsesetItemIcon(index, QIcon(":/check.png"));setItemData(index, !bChecked);emit checkedStateChange(index, !bChecked);
}void CCheckCombox::mousePressEvent(QMouseEvent *e)
{int x = e->pos().x();int iconWidth = iconSize().width();if (x <= iconWidth){int index = currentIndex();updateIndexStatus(index);}elseQComboBox::mousePressEvent(e);
}void CCheckCombox::hidePopup()
{int iconW = iconSize().width();int x = QCursor::pos().x() - mapToGlobal(geometry().topLeft()).x() + geometry().x();int index = view()->selectionModel()->currentIndex().row();if (x >= 0 && x <= iconW){updateIndexStatus(index);}else{QComboBox::hidePopup();}
}

下面看看应用代码:

#include "checkcombox.h"
int main(int argc, char *argv[])
{QApplication a(argc, argv);QWidget widget(NULL, Qt::Tool);widget.setWindowTitle("My ComboBox");CCheckCombox combox;QHBoxLayout *phLayout = new QHBoxLayout(&widget);phLayout->addWidget(&combox);widget.setLayout(phLayout);combox.appendItem("1", false);combox.appendItem("2", true);combox.appendItem("3", true);combox.appendItem("4", true);combox.appendItem("5", true);widget.show();return a.exec();
}

组合框里添加复选框的方法相关推荐

  1. excel添加复选框的两种做法

    内容提要:文章介绍excel添加复选框的方法,通过控件命令和VBA实现批量添加复选框.对Excel感兴趣的朋友可加Excel学习交流群:284029260(www.itblw.com) excel添加 ...

  2. html设置复选框图片,css实现图片右上角添加复选框的方法

    css实现图片右上角添加复选框的方法 发布时间:2020-06-15 10:59:23 来源:亿速云 阅读:221 作者:Leah 这篇文章给大家分享的是css实现图片右上角添加复选框的方法,相信大部 ...

  3. C#ListView控件添加复选框并获取选中的数目

    1.添加复选框:listView1.CheckBoxes = true; 2.选中listview并获取选中的数目: private void listView1_ItemChecked(object ...

  4. 给element的select添加复选框

    需求:要求给select多选的时候,给下拉框前加上复选框样式 element select原样式 需要更改后的样式 html <el-selectv-model="searchObj. ...

  5. layui添加复选框_layui复选框使用介绍

    layui复选框: 效果图 layui复选框,一个主的复选框控制多个从复选框,主复选框和从复选框的颜色不一样 layui复选框的样式,都是在选然后才会有的,所以直接通过css设置就实现不了了.只可以通 ...

  6. 中添加复选框_Word/excel中在方框中打钩/叉的符号,简单方便快捷

    方法1:插入特殊符号 将光标定位于需要打钩的地方,选择[插入]--[符号]--[其他符号]--更改字体为[Windings2] 方法2:使用快捷键 从上面的截图中可以看到设置快捷键,所以在插入特殊符号 ...

  7. QTableView添加复选框

    原文地址::http://blog.sina.com.cn/s/blog_a6fb6cc90101iang.html 相关文章 1.QtableView中添加复选框----https://www.cn ...

  8. MFC中CListCtrl添加复选框,实现单选

    记录MFC项目中CListCtrl添加复选框,实现单选步骤 添加复选框 绑定控件变量 CListCtrl m_ctrList; OnInitDialog函数中添加 m_ctrList.SetExten ...

  9. easyui数据表格显示复选框_EasyUI DataGrid 复选框

    使用checkbox,用户可以选定/取消数据行. 添加checkbox列,我们简单的添加列的checkbox属性,并且设置为true.代码像这样: $('#tt').datagrid({ title: ...

最新文章

  1. kudu接受kafka消息_Kafka 在车好多
  2. matlab 蜂窝网格,blender怎么制作蜂巢网格 蜂窝式网格画法
  3. keras 张量切片
  4. Dataset之Handwritten Digits:Handwritten Digits(手写数字图片识别)数据集简介、安装、使用方法之详细攻略
  5. Linux中的ftp命令怎么写,linux下使用ftp命令
  6. Vue之Vue.set动态新增对象属性
  7. 关于wordpress站点地图代码调试
  8. Git教程——回到从前 (reset)
  9. php重点,php – 课程。重点是什么?
  10. Java虚拟机——虚拟机类的加载机制
  11. vue项目使用阿里云播放器(aliyun)
  12. [复杂网络博弈] 第二章 演化博弈动力学基础
  13. 在线制作流程,数据库模型,网络架构图,你所不知道的工具使用-Freedgo Design
  14. 载波频率成分法——理论公式
  15. wps PPT 中提取视频
  16. 火狐浏览器的css写法,CSS样式IE浏览器跟火狐浏览器兼容写法
  17. php 漏洞_十大PHP安全漏洞
  18. 月中工作总结_在全职工作的9个月中,我是如何从新手转到软件工程师的
  19. 解的存在唯一性定理与逐步逼近法
  20. 微信小程序简单介绍及例子,小白可看

热门文章

  1. 工作阶段总结记录20221020
  2. 基于Webio交互的Pyecharts数据分析脚本小记
  3. 计算机控制及网络技术pdf,计算机控制系统pdf
  4. Android编译问题:java.util.zip.ZipException:duplicate entry...
  5. 在windows下制作mac os x的启动安装U盘
  6. 对话 | 港科大教授权龙:为什么三维重建才是计算机视觉的灵魂?
  7. R 语言:简短的示例
  8. lcd驱动分析(读书笔记)
  9. NullPointerException(空指针异常)
  10. Java从业者职业生涯必备书籍200+