QComboBox實現復選功能(三種方法:嵌套QListWidget, 設置QStandardItemModel, 設置Delegate)
阿新 • • 發佈:2017-12-08
編輯 int() move bsp 下一個 tab url 進行 問題
今天介紹一下一個小東西 — 如何讓QComboBox實現復選功能?
需求:- 下拉列表有復選功能
- 不可編輯
- 顯示所有選中項
- QStandardItemModel + QStandardItem
- QListWidget + QListWidgetItem
- Model/View + QItemDelegate
pListWidget = 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來進行恢復。 效果:
轉載自:╰☆一去?二三裏`
另外關於QCOmbobox的擴展,請點擊:QCompleter自動補全、Qt之QComboBox(基本應用、代理設置)
QComboBox實現復選功能(三種方法:嵌套QListWidget, 設置QStandardItemModel, 設置Delegate)