1. 程式人生 > >QComboBox實現復選功能(三種方法:嵌套QListWidget, 設置QStandardItemModel, 設置Delegate)

QComboBox實現復選功能(三種方法:嵌套QListWidget, 設置QStandardItemModel, 設置Delegate)

編輯 int() move bsp 下一個 tab url 進行 問題

今天介紹一下一個小東西 — 如何讓QComboBox實現復選功能?

需求:
  1. 下拉列表有復選功能
  2. 不可編輯
  3. 顯示所有選中項
關於QComboBox的復選功能有幾種方案:
  1. QStandardItemModel + QStandardItem
  2. QListWidget + QListWidgetItem
  3. Model/View + QItemDelegate
當然,還有其它更好的方式,這裏就不再過多介紹了,下面介紹一種比較簡單的: QListWidget + QListWidgetItem + QCheckBox
    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)