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