QComboBox下拉选项添加勾选框

checkcmbview.h

#ifndef CHECKCMBVIEW_H
#define CHECKCMBVIEW_H

#include 
#include 

class QComboBox;
class QCheckBox;

class CheckCmbView : public QListWidget
{
    Q_OBJECT
public:
    explicit CheckCmbView(QWidget *parent = nullptr, QStringList *columnlabels = nullptr, QComboBox *cmb = nullptr);
    ~CheckCmbView();

    void setChecked(QString item_name);

signals:
    void checkedItem(bool is_checked, QString item_name);

private:
    QComboBox *m_cmbox;
    QList m_check_list;
};

#endif // CHECKCMBVIEW_H

checkcmbview.cpp

#include "checkcmbview.h"
#include 
#include 
#include 

CheckCmbView::CheckCmbView(QWidget *parent, QStringList *columnlabels, QComboBox *cmb)
    :QListWidget(parent),
      m_cmbox(cmb)
{
    setViewMode(QListWidget::ListMode);
    setSelectionMode(QAbstractItemView::SingleSelection);
    for(int i = 0; i < columnlabels->size(); i++) {
        QListWidgetItem *item = new QListWidgetItem();
        item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
        insertItem(model()->rowCount(), item);
        item->setText(columnlabels->at(i));

        QCheckBox* box = new QCheckBox(columnlabels->at(i),this);
        box->setObjectName(columnlabels->at(i));
        setItemWidget(item, box);
        m_check_list.append(box);
        connect(box, &QCheckBox::clicked, this, [this, box]{
            if(!box->isChecked()){
                emit checkedItem(false, box->objectName());
                return;
            }

            emit checkedItem(true, box->objectName());

            foreach(QCheckBox* temp, m_check_list) {
                if(temp != box) temp->setChecked(false);
            }
        });
    }
}

CheckCmbView::~CheckCmbView()
{
    if(!m_check_list.isEmpty()) {
        foreach(QCheckBox* temp, m_check_list) {
            delete temp;
        }
    }
    m_check_list.clear();
}

void CheckCmbView::setChecked(QString item_name)
{
    foreach(QCheckBox* temp, m_check_list) {
        if(temp->objectName() != item_name) {
            temp->setChecked(false);
        } else {
            temp->setChecked(true);
        }
    }
}

调用

QStringList c;
    c << "1" << "2" << "3";
    CheckCmbView* view = new CheckCmbView(this, &c, ui->comboBox);
    ui->comboBox->setModel(view->model());
    ui->comboBox->setView(view);
    ui->comboBox->setCurrentText("2");
    view->setChecked("2");
    connect(view, &CheckCmbView::checkedItem, this, [this](bool is_checked, QString item_name){
        qDebug() << is_checked << item_name;
    });

 

你可能感兴趣的:(QT)