实现支持多选的QComboBox

Qt提供的QComboBox只支持下拉列表内容的单选,但通过QComboBox提供的setModel、setView、setLineEdit三个方法,可以对QComboBox进行改造,使其实现下拉列表选项的多选。

QComboBox可以看作两个组件的组合:一个QLineEdit和一个QListWidget。QLineEidt是框中显示的内容,QListWidget是下拉列表。我们可以实现QComboBox的子类,在其中自定义QLineEdit和QListWidget,然后通过setModel、setView、setLineEdit三个方法替换QComboBox自带的文本框和下拉列表

class MultiComboBox : public QComboBox {
	Q_OBJECT
public:
	MultiComboBox(QWidget* parent = nullptr);
	void addItem(const QString& text, const QVariant& userData = QVariant());  // 重写父类addItem的方法
public slots:
	void stateChangedSlot(int);   // 下拉列表中的内容被选中时触发
private:
	QListWidget* list;
	QLineEdit* edit;
};

MultiComboBox::MultiComboBox(QWidget* parent) : QComboBox(parent) {
	edit = new QLineEdit(this);
	list = new QListWidget(this);
	edit->setReadOnly(true);
	this->setModel(list->model());
	this->setView(list);
	this->setLineEdit(edit);
}

对于我们重新定义的QListWidget,其中包含的每一条内容应该是一个QCheckBox,因此重写QComboBox中的addItem方法,将传入的字符串包装为QCheckBox

void MultiComboBox::addItem(const QString& text, const QVariant& userData) {
	QListWidgetItem* item = new QListWidgetItem(list);
	QCheckBox* checkBox = new QCheckBox(this);
	checkBox->setText(text);
	list->addItem(item);
	list->setItemWidget(item, checkBox);
	connect(checkBox, SIGNAL(stateChanged(int)), this, SLOT(stateChangedSlot(int)));
}

同理,也可以重写addItems方法

当下拉列表中的内容被选中(或取消选中)时,QCheckBox触发stateChanged(int)信号,我们实现一个对应的槽函数,完成MultiComboBox需要实现的逻辑。比如最基本的:将当前选中的内容添加到显示框中

void MultiComboBox::stateChangedSlot(int) {
	QString str = "";
	for (int i = 0; i < list->count(); i++) {
		QCheckBox* cb = static_cast<QCheckBox*>(list->itemWidget(list->item(i)));
		if (cb->isChecked()) {
			str += cb->text();
			str += ";";  // 多个内容以分号隔开
		}
	}
	str = str.removeAt(str.size() - 1);
	if (str != "") {
		edit->setText(str);
	}
	else {
		edit->clear();
	}
}

效果:
在这里插入图片描述

相关推荐

  1. el-table支持

    2024-03-12 07:00:01       30 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-12 07:00:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-12 07:00:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-12 07:00:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-12 07:00:01       20 阅读

热门阅读

  1. 每天学习一个Linux命令之less

    2024-03-12 07:00:01       22 阅读
  2. 二、UML 类图与面向对象设计原则 之 UML概述

    2024-03-12 07:00:01       25 阅读
  3. excel 将缺失的单元个填充为NA

    2024-03-12 07:00:01       34 阅读
  4. [2023年]-hadoop面试真题(三)

    2024-03-12 07:00:01       19 阅读
  5. Unity 3D常用的数据结构

    2024-03-12 07:00:01       22 阅读
  6. 大语言模型提示工程简介

    2024-03-12 07:00:01       22 阅读
  7. 二维的旋转平移矩阵

    2024-03-12 07:00:01       17 阅读
  8. 矩阵最大权值

    2024-03-12 07:00:01       22 阅读
  9. 华为HCIE实验题库哪里有?Cloud相关证书咋样?

    2024-03-12 07:00:01       23 阅读
  10. 【DevOps基础篇】Dockerfile快速掌握

    2024-03-12 07:00:01       20 阅读
  11. web蓝桥杯真题:卡片话标签页

    2024-03-12 07:00:01       19 阅读