QComboBox绑定自定义结构数据

    在开发过程中,经常看别的软件有这么个场景。在下拉菜单中显示的是中文名称,但是后台数据却用的是编码。比如操作员combobox,选中的名称是“小明”,但是保存数据库需要用小明的Id/Number,这时候我们就要通过小明然后对应到Id/Number。

    那Qt中ComboBox当然不能少了这个功能。QComboBox可以设置Item的Data,然后根据你选择的某一项可以对应到这个Data上。

效果图:

思路:

先定义好自己的数据结构 MyData

#ifndef MYDATA_H
#define MYDATA_H

#include <QObject>

class MyData : public QObject
{
    Q_OBJECT
public:
    explicit MyData(QObject *parent = nullptr);
    virtual ~MyData();

    MyData(const int iId,
           const QString strNumber,
           const QString strName,
           QObject *parent = nullptr)
        : QObject(parent),
          m_iId(iId),
          m_strNumber(strNumber),
          m_strName(strName)
    {

    }

    MyData(const MyData &data, QObject *parent = nullptr)
        : QObject(parent)
    {
        m_iId = data.GetId();
        m_strNumber = data.GetNumber();
        m_strName = data.GetName();
    }

    MyData &operator = (const MyData &data)
    {
        if (this == &data)
        {
            return *this;
        }

        m_iId = data.GetId();
        m_strNumber = data.GetNumber();
        m_strName = data.GetName();

        return *this;
    }

    friend bool operator == (const MyData &lhs, const MyData &rhs)
    {
        return (lhs.GetId() == rhs.GetId()
                && lhs.GetNumber() == rhs.GetNumber()
                && lhs.GetName() == rhs.GetName());
    }

    friend bool operator != (const MyData &lhs, const MyData &rhs)
    {
        return !(lhs.GetId() == rhs.GetId()
                && lhs.GetNumber() == rhs.GetNumber()
                && lhs.GetName() == rhs.GetName());
    }

signals:

public slots:

private:
    int m_iId;
    QString m_strNumber;
    QString m_strName;

public:
    int GetId() const { return m_iId; }
    void SetId(const int iId) { m_iId = iId; }

    QString GetNumber() const { return m_strNumber; }
    void SetNumber(const QString &strNumber) { m_strNumber = strNumber; }

    QString GetName() const { return m_strName; }
    void SetName(const QString &strName) { m_strName = strName; }


};

Q_DECLARE_METATYPE(MyData)

#endif // MYDATA_H
#include "mydata.h"

MyData::MyData(QObject *parent) : QObject(parent)
{

}

MyData::~MyData()
{

}

然后用QVariant包装自定义数据。

然后采用ComboBox的addItem(...)方法。

具体代码片段:

void Widget::LoadDataToComboBox()
{
    ui->comboBox->clear();

    for (auto data : m_dataList)
    {
        QVariant var;
        var.setValue(*data);
        ui->comboBox->addItem(data->GetName(), var);
    }

    connect( ui->comboBox,
             SIGNAL(currentIndexChanged(int)),
             this,
             SLOT(onComboBoxIndexChangeSlot(int)) );
}

从QComboBox取数据。

具体代码片段:

void Widget::onComboBoxIndexChangeSlot(int iIndex)
{
    MyData mydata = ui->comboBox->itemData(iIndex).value<MyData>();
    QString strText = QString("数据:\nId:%1\nName:%2\nNumber:%3")
                            .arg(mydata.GetId())
                            .arg(mydata.GetName())
                            .arg(mydata.GetNumber());
    QMessageBox::information(this, "提示", strText);
}

以上就是QComboBox绑定自定义结构数据的关键代码。

demo下载地址点击打开链接

猜你喜欢

转载自blog.csdn.net/king422212809/article/details/80513168