QComboBox多选功能实现类

//头文件
#ifndef MULISELCOMBOX_H
#define MULISELCOMBOX_H
#include <QWidget>
#include <QComboBox>

class QListWidget;
class QLineEdit;

class MuliSelCombox : public QComboBox
{
    Q_OBJECT
public:
    explicit MuliSelCombox(QWidget *parent = nullptr);

    //重新设置sql语句,同时刷新
    void setSql(const QString& sSql);

    //获取选择的项的标签名
    QStringList getSelectTagNames();

    //重写下拉框隐藏函数
    void hidePopup();

private:
    //刷新
    void refresh();

signals:
    //下拉框收起信号
    void sigHidePopup();

private slots:
    void onStateChanged(int);

private:
    QString m_sSql;
    QListWidget *m_pListWidget;  //下拉框列表
    QLineEdit *m_pLineEdit;      //用于显示选择的项
    QStringList m_selectTagName; //选择的标签名
};

#endif // MULISELCOMBOX_H
//实现文件
#include "muliselcombox.h"
#include <QComboBox>
#include "common_global.h"
#include <QSqlQuery>
#include "kbdtabledatamgr.h"
#include <QListWidget>
#include <QCheckBox>
#include <QLineEdit>

MuliSelCombox::MuliSelCombox(QWidget *parent):QComboBox(parent)
{
    m_pLineEdit = NULL;
}

void MuliSelCombox::setSql(const QString &sSql)
{
    m_sSql = sSql;
    refresh();
}

void MuliSelCombox::refresh()
{
    clear();
    delete model();
    delete view();
    QSqlQuery result;
    if(!KbdTableDataMgr::getInstance()->selectOnly(m_sSql,result))
        return;
    m_pListWidget = new QListWidget(this);
    if(m_pLineEdit == NULL)
    {
        m_pLineEdit = new QLineEdit(this);
        m_pLineEdit->setReadOnly(true);
        setLineEdit(m_pLineEdit);
    }
    while(result.next()){
        QString tagName = result.value(CN_TAG_NAME).toString();
        QString desc = result.value(CN_DESC).toString();
        QListWidgetItem *pItem = new QListWidgetItem(m_pListWidget);
        pItem->setData(Qt::UserRole, tagName);
        QCheckBox *pCheckBox = new QCheckBox(this);
        pCheckBox->setText(desc);
        m_pListWidget->addItem(pItem);
        m_pListWidget->setItemWidget(pItem, pCheckBox);
        connect(pCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onStateChanged(int)));
    }
    setModel(m_pListWidget->model());
    setView(m_pListWidget);
}

QStringList MuliSelCombox::getSelectTagNames()
{
    return m_selectTagName;
}

void MuliSelCombox::hidePopup()
{
    emit sigHidePopup();
    QComboBox::hidePopup();
}

void MuliSelCombox::onStateChanged(int state)
{
    //实现设备组多选状态变化
    Q_UNUSED(state);
    m_selectTagName.clear();
    QString selectdData("");
    int nCount = m_pListWidget->count();
    for(int i = 0; i < nCount; ++i)
    {
        QListWidgetItem *pItem = m_pListWidget->item(i);
        QWidget *pWidget = m_pListWidget->itemWidget(pItem);
        QCheckBox *pCheckBox = (QCheckBox *)pWidget;
        if(pCheckBox->isChecked())
        {
            QString strText = pCheckBox->text();
            selectdData.append(strText).append(";");
            QString strData = pItem->data(Qt::UserRole).toString();
            m_selectTagName.append(strData);
        }
    }
    if(selectdData.endsWith(";"))
        selectdData.remove(selectdData.count() - 1, 1);
    if(!selectdData.isEmpty())
    {
        m_pLineEdit->setText(selectdData);
        m_pLineEdit->setToolTip(selectdData);
    }
    else
    {
        m_pLineEdit->clear();
    }
}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值