QComboBox實現復選框功能


需求:

  1. 下拉列表有復選功能

  2. 不可編輯

  3. 顯示所有選中項

關於QComboBox的復選功能有幾種方案:

  1. QStandardItemModel + QStandardItem

  2. QListWidget + QListWidgetItem

  3. Model/View + QItemDelegate

當然,還有其它更好的方式,這里就不再過多介紹了,下面介紹一種比較簡單的:

QListWidget + QListWidgetItem + QCheckBox

//試驗流程設備添加
    QComboBox *box2 = new QComboBox;
    QListWidget *pListWidget = new QListWidget;
    QLineEdit *pLineEdit = new QLineEdit;

    //添加仿真設備
    for (int i = 0; i<m_vec_simdevicename.size(); i++)
    {
        QListWidgetItem *pItem = new QListWidgetItem(pListWidget);
        pListWidget->addItem(pItem);
        pItem->setData(Qt::UserRole, i);
        QCheckBox *pCheckBox = new QCheckBox(this);
        pCheckBox->setText(m_vec_simdevicename[i]);
        pListWidget->addItem(pItem);
        pListWidget->setItemWidget(pItem, pCheckBox);
        connect(pCheckBox, SIGNAL(stateChanged(int)), this, SLOT(stateChanged(int)));
    }

    box2->setModel(pListWidget->model());
    box2->setView(pListWidget);
    box2->setLineEdit(pLineEdit);
    box2->setMinimumWidth(100);
    pLineEdit->setReadOnly(true);
    connect(pLineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(textChanged(const QString &)));

    m_vec_listWidget.push_back(pListWidget);
    m_vec_lineedit.push_back(pLineEdit);
    m_vec_process_devicecombox.push_back(box2);

 

      
void CTestCfgWidget::stateChanged(int state)
{
    bSelected = true;
    QString strSelectedData("");
    strSelectedText.clear();
    QObject *object = QObject::sender();
    QCheckBox *pSenderCheckBox = static_cast<QCheckBox*>(object);

    //需要確定是哪一個下拉框中的checkbox發出的狀態改變信號
    //如何確定?
    //遍歷所有的下拉框中的復選框,找到信號發送方,,確定是哪一個下拉框
    int index = 0;
    for (index=0;index<m_vec_listWidget.size();index++)
    {
        QListWidget *pListWidget = m_vec_listWidget[index];
        int nCount = pListWidget->count();
        for (int k=0;k<nCount;k++)
        {
            QListWidgetItem *pItem = pListWidget->item(k);
            QWidget *pWidget = pListWidget->itemWidget(pItem);
            QCheckBox *pCheckBox = (QCheckBox *)pWidget;
            //找到信號發送方,確定是哪一個下拉框
            if (pSenderCheckBox == pCheckBox)
            {
                goto find;
            }
        }

    }

find:
    qDebug() << "find is true" << endl;

    QListWidget *pListWidget = m_vec_listWidget[index];
    QLineEdit *pLineEdit = m_vec_lineedit[index];
    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 CTestCfgWidget::textChanged(const QString &text)
{
    QObject *object = QObject::sender();
    QLineEdit *psenderlineedit = static_cast<QLineEdit*>(object);
    int index = 0;
    for (int index=0;index<m_vec_lineedit.size();index++)
    {
        if (psenderlineedit == m_vec_lineedit[index])
        {
            break;
        }
    }

    QLineEdit *pLineEdit = m_vec_lineedit[index];
    if (!bSelected)
        pLineEdit->setText(strSelectedText);
}

 

 

當點擊的復選框狀態改變時候,會發送stateChanged信號,槽中通過sender來獲取信號的發送者,然后可以獲取所需要的數據(比如:可以通過setData保存一些自定義的數據),遍歷所有的復選框,獲取選中項的數據進行顯示。

中間遇到一個小問題,當點擊空白處,下來列表會進行收回,此時QLineEdit的數據將會被自動清空,所以此處判斷QLineEdit的textChanged來進行恢復。

效果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM