(资料图片)
下面介绍一种比较简单的:
QListWidget + QListWidgetItem + QCheckBoxpListWidget = 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来进行恢复。
效果:
【领 QT开发教程 学习资料, 点击下方链接莬费领取↓↓ ,先码住不迷路~】
点击这里:
标签:
