QComboBox实现多选全选功能

参考原文链接: 

Qt 下拉复选框(MultiSelectComboBox)(一) 实现下拉框多选,搜索下拉框内容_梦醒梦起的博客-CSDN博客_qt复选框刚开始学习qt时,在遇到下拉复选框问题的时候总是使用表格来实现这个功能,因为表格单元格可以添加代理,而QComboBox类对象在设置代理后总是不生效。使用表格来实现,如果需求本来就是在表格中还好,但有时候只是需要一个下拉复选框,这个时候就需要隐藏边框,设置单元双击输入框禁用等等,会非常麻烦,而且最后的效果也是不敬人意https://blog.csdn.net/qq_43793182/article/details/122080407

效果:

QComboBox实现多选全选功能_第1张图片

在原文链接的基础上补充的代码如下:

<全选功能>

//全选
MultiSelectComboBox.h
QCheckBox* checkAll;

MultiSelectComboBox.cpp

MultiSelectComboBox::MultiSelectComboBox(QWidget *parent)
    : QComboBox {parent}
{
//设置全选框
    checkAll=new QCheckBox();
    QListWidgetItem* currentItem = new QListWidgetItem(list_widget_);
    checkAll->setText("全选");

    list_widget_->addItem(currentItem);
    list_widget_->setItemWidget(currentItem, checkAll);
//全选 信号和槽
   connect(checkAll, &QCheckBox::released, [=]() mutable {
        bool ischecked = checkAll->isChecked();
        for (int i = 0; i < list_widget_->count(); i++) {
QCheckBox *check_box = 
static_cast(list_widget_->itemWidget(list_widget_->item(i)));
        check_box->setChecked(ischecked);
        }
    });
}
//单项与全选状态
void MultiSelectComboBox::checkAllState(int state)
{
 if (Qt::Unchecked == state)
    {
       checkAll->setChecked(false);
    }
    else if (Qt::Checked == state)
    {
        bool isallcheck = true;
        for (int i = 1; i < list_widget_->count(); i++)
        {
            QCheckBox *check_box = static_cast(list_widget_->itemWidget(list_widget_->item(i)));
            if(check_box->isChecked() == false)
            {
                isallcheck = false;
            }
            }
       checkAll->setChecked(isallcheck);
    }
}
//在创造出下拉框checkbox处连接单项与全选状态的信号和槽
void MultiSelectComboBox::addItem(const QString &_text, const QVariant &_variant /*= QVariant()*/)
{
    Q_UNUSED(_variant);
    QListWidgetItem *item     = new QListWidgetItem(list_widget_);
    QCheckBox       *checkbox = new QCheckBox(this);
    checkbox->setText(_text);
    list_widget_->addItem(item);
    list_widget_->setItemWidget(item, checkbox);
    connect(checkbox, &QCheckBox::stateChanged, this, &MultiSelectComboBox::stateChange);
//单项与全选状态的信号和槽
    connect(checkbox,&QCheckBox::stateChanged,this,&MultiSelectComboBox::checkAllState);
}

使用:

1.将QComboBox控件提升为该MultiSelectComboBox类

QComboBox实现多选全选功能_第2张图片

QComboBox实现多选全选功能_第3张图片

QComboBox实现多选全选功能_第4张图片 

 2.在QComboBox中加入QcheckbBox

参考原博主写好的函数直接用就可以了

资源: 

https://download.csdn.net/download/FWY0x7CF/86790816

你可能感兴趣的:(qt,开发语言)