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

  

void MultiComboBox::stateChanged(int state)
{
bSelected = true;
QString strSelectedData("");
strSelectedText.clear();
QObject *object = QObject::sender();
QCheckBox *pSenderCheckBox = static_cast(object);
int nCount = pListWidget->count();
for (int i = 0; i < nCount; ++i)
{
QListWidgetItem *pItem = pListWidget->item(i);
QWidget *pWidget = pListWidget->itemWidget(pItem);
QCheckBox *pCheckBox = (QCheckBox *)pWidget;
if (pCheckBox->isChecked())
{
QString strText = pCheckBox->text();
strSelectedData.append(strText).append(";");
}
//所点击的复选框
if (pSenderCheckBox == pCheckBox)
{
int nData = pItem->data(Qt::UserRole).toInt();
qDebug() << QString("I am sender...id : %1").arg(nData);
}
}
if (strSelectedData.endsWith(";"))
strSelectedData.remove(strSelectedData.count() - 1, 1);
if (!strSelectedData.isEmpty())
{
//ui.comboBox->setEditText(strSelectedData);
strSelectedText = strSelectedData;
pLineEdit->setText(strSelectedData);
pLineEdit->setToolTip(strSelectedData);
}
else
{
pLineEdit->clear();
//ui.comboBox->setEditText("");
}
bSelected = false;
}

  

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

最新文章

  1. 了不起的全能MAC系统监测工具iStat Menus 5下载
  2. bootstrap学习笔记【转】
  3. javascript this关键字指向详解
  4. UVa 489 刽子手游戏
  5. Web Service 一些对外公开的网络服务接口
  6. hdoj 1045 Fire Net
  7. [AngularJS + Webpack] Production Setup
  8. Hibernate四 批量处理
  9. 微信公众号H5支付遇到的那些坑
  10. WebJars
  11. 微信小程序 页面跳转方式
  12. LOJ2538 PKUWC2018 Slay the Spire DP
  13. 006-UDP用户数据报文协议
  14. usb枚举
  15. c# 静态构造函数与私有构造函数共存
  16. cv2 与 matplotlib 的 Bug 记录
  17. mysql 俩个时间相减后取分钟
  18. 高性能web服务器(热死你)Resin Linux的安装、配置、部署,性能远超Nginx支持Java、PHP等
  19. python的MetaClass的代码分析。基于廖雪峰博客代码
  20. vue2.0 安装及项目搭建(一)

热门文章

  1. Light OJ 1025 - The Specials Menu(区间DP)
  2. module_init和init_module的区别
  3. 【动态规划】Vijos P1493 传纸条(NOIP2008提高组第三题)
  4. vtk 中文显示
  5. C语言数据类型的理解
  6. Java---获得系统窗口的分辨率
  7. 【模拟】Class 解题报告
  8. Thinkphp分页时查询条件保存方法
  9. Web —— tomcat 问题解决
  10. Android抓包工具Fiddler抓取数据