Qt 中 QComboBox 嵌入复选框

~~~~我的生活,我的点点滴滴!!

         很多时候界面的空间是有限的,如果有很多选择框要放怎么办?下拉框怎么样?--------搜了一搜,有人这样干过,特此学习一下,记录在此!

看看QComboBox为了们提供了哪些有用的接口。

void QComboBox::addItem(const QIcon & icon, const QString & text, const QVariant & userData = QVariant())
    Adds an item to the combobox with the given icon and text, and containing the specified userData (stored in the Qt::UserRole). The item is appended to the list of existing items.
第一个参数为图片, 第二个为内容,第三个为我们自定义数据存储。

如果可以利用图片的切换来达到效果,也就是准备两张图片,选中与未选中(图片我直接截取Qt-designer里面的复选框),我们需要注意的点:

1、鼠标点击复选框图片时,判断点击的是哪一项

2、取出那一项的userData判断当前是什么状态

3、根据状态更新图片

看下面代码,代码有注释

class CCheckCombox : public QComboBox
{
    Q_OBJECT
public:
    explicit CCheckCombox(QWidget *parent = 0);

    //添加下拉框内容
    void appendItem(const QString &text, bool bChecked);

    //QComboBox的虚函数用来隐藏列表框,当单击是复选框时不让隐藏,用来改变状态
    void hidePopup();

protected:
    void mousePressEvent(QMouseEvent *event);

private:
    //更新更改项的状态
    void updateIndexStatus(int index);

signals:
    //状态改变后发送一个信号,告诉外界。
    void checkedStateChange(int index, bool bChecked);

public slots:

};
上面为头文件里面的内容,看起来也没有想象中的那么多,ps----本人使用的是Qt5.3.1

源文件:

CCheckCombox::CCheckCombox(QWidget *parent) :
    QComboBox(parent)
{

}

void CCheckCombox::appendItem(const QString &text, bool bChecked)
{
    QIcon icon;
    if( bChecked )
    {
        icon.addFile(":/Image/check.png");
    }
    else
    {
        icon.addFile(":/Image/uncheck.png");
    }

    addItem(icon, text, bChecked);
}

void CCheckCombox::updateIndexStatus(int index)
{
    bool bChecked = this->itemData(index).toBool();

    if( bChecked )
    {
        this->setItemIcon(index, QIcon(":/Image/uncheck.png"));
    }
    else
    {
        this->setItemIcon(index, QIcon(":/Image/check.png"));
    }

    setItemData(index, !bChecked);

    emit checkedStateChange(index, !bChecked);
}

void CCheckCombox::mousePressEvent(QMouseEvent *event)
{
    int x = event->pos().x();

    int iconWidth = this->iconSize().width();

    if( x <= iconWidth )
    {
        int index = this->currentIndex();

        updateIndexStatus(index);
    }
    else
    {
        QComboBox::mousePressEvent(event);
    }
}

void CCheckCombox::hidePopup()
{
    int iconWidth = this->iconSize().width();

    int x = QCursor::pos().x() - mapToGlobal(geometry().topLeft()).x() + geometry().x();

    int index = view()->selectionModel()->currentIndex().row();

    if( x >= 0 && x <= iconWidth )
    {
        updateIndexStatus(index);
    }
    else
    {
        QComboBox::hidePopup();
    }
}
上面基本上就实现了所需功能,测试样例

    ui->comboBox->appendItem("1111", false);
    ui->comboBox->appendItem("2222", false);
    ui->comboBox->appendItem("3333", true);
    ui->comboBox->appendItem("4444", true);
    ui->comboBox->appendItem("5555", false);
    ui->comboBox->appendItem("6666", true);

本人提升了这个控件,操作也方便!

附Demo 下载地址:http://download.csdn.net/detail/ac_huang/7582797




你可能感兴趣的:(Qt 中 QComboBox 嵌入复选框)