一 MultiSelectComboBox Qt 下拉复选框 实现下拉框多选( 二 )


选项变化槽函数代码如下(示例):
connect(checkbox, &QCheckBox::stateChanged, this, &MultiSelectComboBox::stateChange);
void MultiSelectComboBox::stateChange(int _row){Q_UNUSED(_row);QString selected_data("");int count = list_widget_->count();for (int i = 1; i < count; i++){QWidget *widget = list_widget_->itemWidget(list_widget_->item(i));QCheckBox *check_box = static_cast(widget);if (check_box->isChecked()){selected_data.append(check_box->text()).append(";");}}selected_data.chop(1);if (!selected_data.isEmpty()){line_edit_->setText(selected_data);}else{line_edit_->clear();}line_edit_->setToolTip(selected_data);emit selectionChange(selected_data);}
4. 对外接口定义
考虑到使用方便,这里定义了一些接口方便用户使用,接口含义见下方注释 (文本框代表) 。
接口定义如下(示例):
//隐藏下拉框virtual void hidePopup();//添加一条选项void addItem(const QString& _text, const QVariant& _variant = QVariant());//添加多条选项void addItems(const QStringList& _text_list);//返回当前选中选项QStringList currentText();//返回当前选项条数int count()const;//设置搜索框默认文字void SetSearchBarPlaceHolderText(const QString _text);//设置文本框默认文字void SetPlaceHolderText(const QString& _text);//下拉框状态恢复默认(所有选项都恢复为未选中状态)void ResetSelection();//清空所有内容(选项内容全部清空)void clear();//文本框内容清空(选项内容不清空,所有选项都恢复为未选中状态,文本框清空)void TextClear();//设置选中文本--单void setCurrentText(const QString& _text);//设置选中文本--多void setCurrentText(const QStringList& _text_list);//设置搜索框是否禁用void SetSearchBarHidden(bool _flag);
5. 代码实现
头文件:
#pragma once#include #include #include #include #include class MultiSelectComboBox : public QComboBox{Q_OBJECTpublic:MultiSelectComboBox(QWidget *parent = Q_NULLPTR);~MultiSelectComboBox();//隐藏下拉框virtual void hidePopup();//添加一条选项void addItem(const QString& _text, const QVariant& _variant = QVariant());//添加多条选项void addItems(const QStringList& _text_list);//返回当前选中选项QStringList currentText();//返回当前选项条数int count()const;//设置搜索框默认文字void SetSearchBarPlaceHolderText(const QString _text);//设置文本框默认文字void SetPlaceHolderText(const QString& _text);//下拉框状态恢复默认void ResetSelection();//清空所有内容void clear();//文本框内容清空void TextClear();//设置选中文本--单void setCurrentText(const QString& _text);//设置选中文本--多void setCurrentText(const QStringList& _text_list);//设置搜索框是否禁用void SetSearchBarHidden(bool _flag);protected://事件过滤器virtual bool eventFilter(QObject *watched,QEvent *event);//滚轮事件virtual void wheelEvent(QWheelEvent *event);//按键事件virtual void keyPressEvent(QKeyEvent *event);private slots://槽函数:文本框文本变化void stateChange(int _row);//槽函数:搜索框文本变化void onSearch(const QString& _text);//槽函数:点击下拉框选项void itemClicked(int _index);signals://信号:发送当前选中选项void selectionChange(const QString _data);private://下拉框QListWidget* list_widget_;//文本框,搜索框QLineEdit* line_edit_, *search_bar_;//搜索框显示标志bool hidden_flag_;//下拉框显示标志bool show_flag_;};
实现:
#include "multi_select_combobox.h"MultiSelectComboBox::MultiSelectComboBox(QWidget *parent): QComboBox(parent), hidden_flag_(true), show_flag_(false){list_widget_ = new QListWidget();line_edit_ = new QLineEdit();search_bar_ = new QLineEdit();/*设置搜索框*/QListWidgetItem* currentItem = new QListWidgetItem(list_widget_);//设置搜索框提示信息search_bar_->setPlaceholderText("Search.........");//显示清除按钮search_bar_->setClearButtonEnabled(true);list_widget_->addItem(currentItem);list_widget_->setItemWidget(currentItem, search_bar_);/*设置文本框*///设为只读,因为该输入框只用来显示选中的选项,称为文本框更合适些line_edit_->setReadOnly(true);//把当前对象安装(或注册)为事件过滤器,当前也称为过滤器对象 。事件过滤器通常在构造函数中进行注册 。line_edit_->installEventFilter(this);//设置禁用样式,因为不受样式表控制,临时这样解决line_edit_->setStyleSheet("QLineEdit:disabled{background:rgb(233,233,233);}");this->setModel(list_widget_->model());this->setView(list_widget_);this->setLineEdit(line_edit_);connect(search_bar_, SIGNAL(textChanged(const QString&)), this, SLOT(onSearch(const QString&)));connect(this, static_cast