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

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

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

[html] view plain copy

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

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

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

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

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

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

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

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

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

[html] view plain copy

  1. 头文件
  2. #ifndef _CHECK_COMBOX_H
  3. #define _CHECK_COMBOX_H
  4. #include <qcombobox.h>
  5. class CCheckCombox : public QComboBox
  6. {
  7. Q_OBJECT
  8. public:
  9. CCheckCombox(QWidget *parent = NULL);
  10. void appendItem(const QString &text, bool bChecked);
  11. void hidePopup();
  12. protected:
  13. void mousePressEvent(QMouseEvent *e);
  14. signals:
  15. void checkedStateChange(int index, bool bChecked);
  16. private:
  17. void updateIndexStatus(int index);
  18. };
  19. #endif

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

[html] view plain copy

  1. 源文件
  2. #include "checkcombox.h"
  3. #include <QMouseEvent>
  4. #include <qdebug.h>
  5. #include <qabstractitemview.h>
  6. CCheckCombox::CCheckCombox(QWidget *parent) : QComboBox(parent)
  7. {
  8. }
  9. void CCheckCombox::appendItem(const QString &text, bool bChecked)
  10. {
  11. QIcon icon;
  12. if (bChecked)
  13. icon.addFile(":/check.png");
  14. else
  15. icon.addFile(":/uncheck.png");
  16. addItem(icon, text, bChecked);
  17. }
  18. void CCheckCombox::updateIndexStatus(int index)
  19. {
  20. bool bChecked = itemData(index).toBool();
  21. if (bChecked)
  22. setItemIcon(index, QIcon(":/uncheck.png"));
  23. else
  24. setItemIcon(index, QIcon(":/check.png"));
  25. setItemData(index, !bChecked);
  26. emit checkedStateChange(index, !bChecked);
  27. }
  28. void CCheckCombox::mousePressEvent(QMouseEvent *e)
  29. {
  30. int x = e->pos().x();
  31. int iconWidth = iconSize().width();
  32. if (x <= iconWidth)
  33. {
  34. int index = currentIndex();
  35. updateIndexStatus(index);
  36. }
  37. else
  38. QComboBox::mousePressEvent(e);
  39. }
  40. void CCheckCombox::hidePopup()
  41. {
  42. int iconW = iconSize().width();
  43. int x = QCursor::pos().x() - mapToGlobal(geometry().topLeft()).x() + geometry().x();
  44. int index = view()->selectionModel()->currentIndex().row();
  45. if (x >= 0 && x <= iconW)
  46. {
  47. updateIndexStatus(index);
  48. }
  49. else
  50. {
  51. QComboBox::hidePopup();
  52. }
  53. }

下面看看应用代码:

[html] view plain copy

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

http://blog.csdn.net/rabinsong/article/details/9007283

时间: 2024-10-03 23:00:21

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

给Repeater控件里添加序号的5种方法

.net是目前非常热门的一种程序编译语言,在.net培训中的众多知识点中,给Repeater控件里添加序号的5种方法是非常重要的一个.下面就由达内的老师为大家介绍一下这方面的内容. Repeater是我们经常用的一个显示数据集的数据控件,经常我们希望在数据前显示数据的序号,那么我们该怎么为Repeater控件添加序号呢?下面编辑为大家介绍几种常用的为Repeater控件添加序号的方法: 方法一:利用Container.ItemIndex属性,代码如下: <Itemtemplate ><%

C#ListView控件添加Checkbox复选框并获取选中的数目,检查checkbox是否勾选

原地址:http://blog.csdn.net/lucky51222/article/details/41892429 1.添加复选框:listView1.CheckBoxes = true; 2.选中listview并获取选中的数目: [csharp] view plain copy private void listView1_ItemChecked(object sender, ItemCheckedEventArgs e) { e.Item.Selected = e.Item.Chec

怎样使一个INPUT框里的文字在框被点击后自动全选或清除?

$("#smsContent").focus(function(){ this.select(); }); <input name="keywords" type="text" value="关键字" onfocus="if(this.value == this.defaultValue) this.value = ''" onblur="if(this.value == '') this.

【Eclipse使用】在eclipse里添加源文件和Api的方法

一.源代码添加 你的JDK安装目录下%Java_home%/src.zip文件就是源码,解压缩找到对应包下面的类即可. 如果是Eclipse开发,ctr+鼠标左击,出现不了源码的话,在弹出的视图中点击attach source,选择src.zip即可. 二.API添加 JDK API文档 Java SE 8 API文档: http://www.Oracle.com/technetwork/Java/javase/documentation/jdk8-doc-downloads-2133158.h

项目实战之FORM、复选框组件的实现

一.使用描述 对于复选框组件来说,主要的问题在于,勾选后返回的值要处理为数字,传递给接口,接口返回的值也是数字,但是在前台做回显时在table中数据格式需要转义为文字或者在form中数据格式需要回显在复选框中. 二.功能代码 1,转为数字1为勾选,0为未勾选 constructor(props) { super(props); this.state = { checkStatus: 0 } } //选中是true值转为1,否则就是0 handleIsChecked = (e) => { this

【mfc】组框、单选框控件与复选框控件

VC6中的MFC中的单选框与复选框控件也不简单,它没有VS中C#那样可以之间通过一个封装之后的函数进行判断,该单选框/复选框有没有被选中啊?或者控制单选框/复选框的选中状态.这东西比较复杂,通过相应的值来控制的. 一.基本目标 下面就用一个简单例子来说明VC6中的MFC中的单选框与复选框控件,点击"确定"按钮能够判断对话框中的所有单选框与复选框的选中状态.Radio1-Radio3互成一个组,组内仅能够有一个组员被选中,Radio4-Radio5也互成一组,选择Radio4能够令复选框

如何根据集合动态构建复选框选择控件

背景:根据列表或集合,构建复选框控件,从中选取若干选项.比如,构建城市选择控件,城市按照字母分组进行展示.再比如,构建学生选择控件,学生按照城市进行分组展示.常作为分部视图使用. 效果图: 如图,城市以红色字体显示,李雷来自北京,同时Lily和Lucy来自纽约. HTML代码如下: 1 <table><tr><td><input type="checkbox" id="checkedAll" onclick="wh

ExtJs实现复选框组Checkboxgroup单勾选及复选框组对多个复选框组跨控件全选

ExtJs实现复选框Checkboxgroup单勾选及跨控件全选 由于项目的需要,我们要将EXT的控件Checkboxgroup复选框组改造成但勾选,并且实现一个复选框组控制其他多个复选框组的全选,以下是关于如何实现的代码片段. 1.创建CheckboxGroup对象 1,新建空的EOS6.5的工程,新建com.towngas.tcis. gridlock构件包: 2,在com.towngas.tcis.gridlock构件包的"展现"节点下的"页面资源"节点中创建

jquery获取复选框的值

勾选checkbox,并把勾选的值显示在某个div中 1 <!DOCTYPE html > 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title> 获取爱好 </title> 6 <meta http-equiv = "content-type" content ="text/html;charset=utf-8" /&