qt 带复选框的下拉列表

该博客介绍了如何使用Qt库自定义QComboBox,使其下拉列表包含复选框。通过设置QAbstractItemView和QAbstractItemModel,将QListWidget与QComboBox结合,实现了在下拉列表中添加QCheckBox的功能。用户可以选择多个选项,并通过QLineEdit展示已选值。此外,还提供了添加和管理复选框的方法以及信号和槽的连接来响应状态变化。
摘要由CSDN通过智能技术生成

参考 Qt之QComboBox定制
在这里插入图片描述

核心思想:

void QComboBox::setView(QAbstractItemView *itemView)
void QComboBox::setModel(QAbstractItemModel *model)

下拉列表拉出来的那个界面可以是 QAbstractItemView ,比如QListWidget 。只要在构造函数中:

QComboBox->setModel(pListWidget->model());
QComboBox->setView(pListWidget);

设置好其他的操作就和 QListWidget 一样了。

所以 我们想要在下拉列表里加入复选框,只需要设置

	QListWidgetItem *pItem = new QListWidgetItem(pListWidget);
	pListWidget->addItem(pItem);
	QCheckBox *pCheckBox = new QCheckBox(this); 
	pCheckBox->setText(value);
	pListWidget->addItem(pItem);
	pListWidget->setItemWidget(pItem, pCheckBox);
	connect(pCheckBox, SIGNAL(stateChanged(int)), this, SLOT(Slot_StateChanged(int)));

即可。

同理,下拉列表还可以是表格形式

源码

#pragma once
#include <qcombobox.h>
#include<QListWidget>
#include<QLineEdit>

class CheckComboBox:
	public QComboBox
{
	Q_OBJECT
public:
	CheckComboBox(QWidget * parent = nullptr);
	~CheckComboBox();
	void setValues(QStringList values);
	void push_back(QString value);
	QString text();//返回用户选择的值
protected slots:
	void Slot_StateChanged(int);
private:
	QListWidget *pListWidget = nullptr;
	QLineEdit *pLineEdit = nullptr;
	BASEINFO m_strInfo;
};


#include "CheckComboBox.h"
#include "QCheckBox"
CheckComboBox::CheckComboBox(QWidget * parent ) :QComboBox(parent)
{
	pListWidget = new QListWidget(this);
	pLineEdit = new QLineEdit(this);
	this->setModel(pListWidget->model());
	this->setView(pListWidget);
	this->setLineEdit(pLineEdit);
	pLineEdit->setReadOnly(true);
}
CheckComboBox::~CheckComboBox()
{
	if (pListWidget)
	{
		delete pListWidget;
		pListWidget = nullptr;
	}
	if (pLineEdit)
	{
		delete pLineEdit;
		pLineEdit = nullptr;
	}
}

void CheckComboBox::setValues(QStringList values)
{
	for (auto value : values)
	{
		push_back(value);
	}
}
void CheckComboBox::push_back(QString value)
{
	QListWidgetItem *pItem = new QListWidgetItem(pListWidget);
	pListWidget->addItem(pItem);
	QCheckBox *pCheckBox = new QCheckBox(this); 
	pCheckBox->setText(value);
	pListWidget->addItem(pItem);
	pListWidget->setItemWidget(pItem, pCheckBox);
	connect(pCheckBox, SIGNAL(stateChanged(int)), this, SLOT(Slot_StateChanged(int)));
	pCheckBox->setChecked(true);
}

void CheckComboBox::Slot_StateChanged(int)
{
	QString  strSelectedData;
	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(";");
		}
	}
	//避免最后一个item添加";"
	if (strSelectedData.endsWith(";"))
		strSelectedData.remove(strSelectedData.count() - 1, 1);
	if (!strSelectedData.isEmpty())
	{
		pLineEdit->setText(strSelectedData);
		pLineEdit->setToolTip(strSelectedData);
	}
 
 
}
QString CheckComboBox::text()
{
	return pLineEdit->text();
}

 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值