这个是最近的一个项目上需要实现的功能。要求如下:
- 下拉列表的项目可以多选
- 显示框不能编辑
- 所选中的项目在显示框中出现
下面根据网上的提示代码(参照博客 一去二三里),主要实现如下代码(与参照略有不同):
实现方案:
QListWidget、QListWidgetItem、QComboBox
初始化控件及模拟数据填充:
1 comboBox = new QComboBox(this); //初始化显示控件 2 3 QHBoxLayout* mainLayout = new QHBoxLayout(this); 4 mainLayout->addWidget(comboBox); 5 setLayout(mainLayout); 6 7 //初始化数据源 8 listWidget = new QListWidget; 9 for(int i = 0; i < 5; ++i) 10 { 11 QListWidgetItem* item = new QListWidgetItem(tr.("Item %1").arg(i)); 12 item->setCheckState(Qt::Unchecked); //显示复选框 13 14 listWidget->addItem(item); 15 } 16 17 //默认选中第一个数据 18 QListWidgetItem* item = listWidget->item(0); 19 if(item) 20 { 21 item->setCheckState(Qt::Checked); 22 } 23 24 //设置数据源到显示控件中 25 comboBox->setModel(listWidget->model()); 26 comboBox->setView(listWidget); 27 28 //设置只读编辑框 29 comboBox->setEditable(true); 30 QLineEdit* lineEdit = comboBox->lineEdit(); 31 if(lineEdit) 32 { 33 lineEdit->setReadOnly(true); 34 } 35 36 setMinimumWidth(200); 37 38 //更新显示的内容 39 connect(comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onCurrentIndexChanged(int)));
更新显示内容的代码如下(需要在头文件中设置该函数为槽函数):
1 //获取当前点击的对象 2 QListWidgetItem* item = listWidget->item(index); 3 if(!item) 4 return ; 5 6 //更新当前点击对象的选中状态 7 if(item->checkState() == Qt::Unchecked) 8 { 9 item->setCheckState(Qt::Checked); 10 } 11 else 12 { 13 item->setCheckState(Qt::Unchecked); 14 } 15 16 //循环获取所有选中状态的对象显示文字 17 QString text; 18 for(int row = 0, rows = listWidget->count(); row < rows; ++row) 19 { 20 QListWidgetItem* item = listWidget->item(row); 21 if(item && item->checkState() == Qt::Checked) 22 { 23 text.append(item->text() + ";"); 24 } 25 } 26 27 //更新显示控件的文字 28 comboBox->lineEdit()->setText(text.mid(0, text.size() - 1));
完整的实现代码,请点击 这里
MultiComboBox文件夹里包含所有的实现文件