需求:
  1. 下拉列表有复选功能
  2. 不可编辑
  3. 显示所有选中项
 
关于QComboBox的复选功能有几种方案:
  1. QStandardItemModel + QStandardItem
  2. QListWidget + QListWidgetItem
  3. Model/View + QItemDelegate
当然,还有其它更好的方式,这里就不再过多介绍了,下面介绍一种比较简单的:
QListWidget + QListWidgetItem + QCheckBox
  1. pListWidget = new QListWidget(this);
  2. pLineEdit = new QLineEdit(this);
  3. for (int i = 0; i < 5; ++i)
  4. {
  5. QListWidgetItem *pItem = new QListWidgetItem(pListWidget);
  6. pListWidget->addItem(pItem);
  7. pItem->setData(Qt::UserRole, i);
  8. QCheckBox *pCheckBox = new QCheckBox(this);
  9. pCheckBox->setText(QStringLiteral("Qter%1").arg(i));
  10. pListWidget->addItem(pItem);
  11. pListWidget->setItemWidget(pItem, pCheckBox);
  12. connect(pCheckBox, SIGNAL(stateChanged(int)), this, SLOT(stateChanged(int)));
  13. }
  14. ui.comboBox->setModel(pListWidget->model());
  15. ui.comboBox->setView(pListWidget);
  16. ui.comboBox->setLineEdit(pLineEdit);
  17. pLineEdit->setReadOnly(true); //ui.comboBox->setEditable(true);
  18. connect(pLineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(textChanged(const QString &)));

  

  1. void MultiComboBox::stateChanged(int state)
  2. {
  3. bSelected = true;
  4. QString strSelectedData("");
  5. strSelectedText.clear();
  6. QObject *object = QObject::sender();
  7. QCheckBox *pSenderCheckBox = static_cast(object);
  8. int nCount = pListWidget->count();
  9. for (int i = 0; i < nCount; ++i)
  10. {
  11. QListWidgetItem *pItem = pListWidget->item(i);
  12. QWidget *pWidget = pListWidget->itemWidget(pItem);
  13. QCheckBox *pCheckBox = (QCheckBox *)pWidget;
  14. if (pCheckBox->isChecked())
  15. {
  16. QString strText = pCheckBox->text();
  17. strSelectedData.append(strText).append(";");
  18. }
  19. //所点击的复选框
  20. if (pSenderCheckBox == pCheckBox)
  21. {
  22. int nData = pItem->data(Qt::UserRole).toInt();
  23. qDebug() << QString("I am sender...id : %1").arg(nData);
  24. }
  25. }
  26. if (strSelectedData.endsWith(";"))
  27. strSelectedData.remove(strSelectedData.count() - 1, 1);
  28. if (!strSelectedData.isEmpty())
  29. {
  30. //ui.comboBox->setEditText(strSelectedData);
  31. strSelectedText = strSelectedData;
  32. pLineEdit->setText(strSelectedData);
  33. pLineEdit->setToolTip(strSelectedData);
  34. }
  35. else
  36. {
  37. pLineEdit->clear();
  38. //ui.comboBox->setEditText("");
  39. }
  40. bSelected = false;
  41. }

  

  1. void MultiComboBox::textChanged(const QString &text)
  2. {
  3. if (!bSelected)
  4. pLineEdit->setText(strSelectedText);
  5. }
  当点击的复选框状态改变时候,会发送stateChanged信号,槽中通过sender来获取信号的发送者,然后可以获取所需要的数据(比如:可以通过setData保存一些自定义的数据),遍历所有的复选框,获取选中项的数据进行显示。
  中间遇到一个小问题,当点击空白处,下来列表会进行收回,此时QLineEdit的数据将会被自动清空,所以此处判断QLineEdit的textChanged来进行恢复。
 
效果:

QComboBox实现复选功能的更多相关文章

  1. QComboBox实现复选功能(三种方法:嵌套QListWidget, 设置QStandardItemModel, 设置Delegate)

    今天介绍一下一个小东西 — 如何让QComboBox实现复选功能?   需求: 下拉列表有复选功能 不可编辑 显示所有选中项   关于QComboBox的复选功能有几种方案: QStandardIte ...

  2. QT 创建一个具有复选功能的下拉列表控件

    最近研究了好多东西,前两天突然想做一个具有复选功能的下拉列表框.然后在网上"学习"了很久之后,终于发现了一个可以用的,特地发出来记录一下. 一.第一步肯定是先创建一个PROJECT ...

  3. Flex 扩展combobox 实现复选功能

    前段时间,老大召唤,给个任务,研究一下flex的combobox控件 实现复选功能(flex自带的combobox控件不可以复选),小兵能力有限,哪里可以扩展呀,网上看了别人写的,发现总是有点瑕疵(关 ...

  4. duilib 修复CTreeViewUI复选功能判断不准确的bug

    转载请说明出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/42265209 CTreeViewUI里面自带了复选的功能,但是复选功能存在 ...

  5. 在QComboBox的基础上实现复选功能

    这个是最近的一个项目上需要实现的功能.要求如下: 下拉列表的项目可以多选 显示框不能编辑 所选中的项目在显示框中出现 下面根据网上的提示代码(参照博客 一去二三里),主要实现如下代码(与参照略有不同) ...

  6. 为DataGridView控件实现复选功能

    实现效果: 知识运用: DataGridViewCheckBoxColumn类 实现代码: private class Fruit { public int Price { get; set; } p ...

  7. 个人永久性免费-Excel催化剂功能第58波-批量生成单选复选框

    插件的最大威力莫过于可以把简单重复的事情批量完全,对日常数据采集或打印报表排版过程中,弄个单选.复选框和用户交互,美观的同时,也能保证到数据采集的准确性,一般来说用原生的方式插入单选.复选框,操作繁琐 ...

  8. 自定义实现 PyQt5 下拉复选框 ComboCheckBox

    一.前言 由于最近的项目需要具有复选功能,但过多的复选框会影响界面布局和美观,因而想到把 PyQt5 的下拉列表和复选框结合起来,但在 PyQt5 中并没有这样的组件供我们使用,所以想要自己实现一个下 ...

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

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

随机推荐

  1. 图论(Tarjan缩点):BZOJ 1194: [HNOI2006]潘多拉的盒子

    1194: [HNOI2006]潘多拉的盒子 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 344  Solved: 181[Submit][Stat ...

  2. ISAP 模板

    #include <iostream> #include <cstring> #include <cstdio> #include <queue> us ...

  3. expresscalculate

    //本程序接受任意含有+.-.*./和()的数值表达式,数值允许带小数,输入以#结束.如:((2.4+3.5)*2-(2+3.5)/2)*(2+3)# #include <stdio.h> ...

  4. 配置openStack使用spice

    注:因为在测试配置过程中反复配置过多次,以下内容可能并不完整,有待验证. 按官方文档(openstack-install-guide-yum-juno)搭建和配置的OpenStack默认使用novnc ...

  5. sql第一课笔记

    这是我看了imooc的视频教程之后重新写的笔记. 虽然之前也是学习过SQL Server数据库,但是也是忘记得差不多了.现在重新捡起来,安装一次数据库练习,使用的是mysql. 第一课是最简单的创建, ...

  6. Java 判断一段网络资源是否存在

    package cn.ycmedia.common.utils; import java.io.InputStream; import java.net.URL; import java.net.UR ...

  7. 蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例

    本文从功能需求的角度分析一般蓝牙BLE单芯片的应用框架(SDK Framework)的接口设计过程,并以TI CC2541为例说明BLE的应用开发方法. 一.应用框架(Framework) 我们熟知的 ...

  8. java 数据库两种连接方法

    package jdbc; import java.sql.*; public class ConnectionDemo2 { public static final String DBDRIVER= ...

  9. U盘启动安装CentOS 6.3

    无光驱U盘启动安装CentOS 6.3的一些必要条件: 1.主板要支持U盘启动 2.8G的U盘 3.UltraISO软件 http://www.linuxidc.com/Linux/2010-03/2 ...

  10. [转] Java中的访问控制

    可见/访问性 在同一类中 同一包中 不同包中  同一包子类中  不同包子类中   public  yes  yes  yes  yes  yes  protected   yes  yes  no   ...