QComboBox绑定自定义结构数据

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

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

效果图:

QComboBox绑定自定义结构数据_第1张图片

思路:

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

#ifndef MYDATA_H
#define MYDATA_H

#include 

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();
    QString strText = QString("数据:\nId:%1\nName:%2\nNumber:%3")
                            .arg(mydata.GetId())
                            .arg(mydata.GetName())
                            .arg(mydata.GetNumber());
    QMessageBox::information(this, "提示", strText);
}

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

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include "mydata.h"

#include 

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;

    QList m_dataList;

private:
    void Initialize();
    void CreateComboBoxData();
    void LoadDataToComboBox();

public slots:
    void onComboBoxIndexChangeSlot(int iIndex);

};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include 
#include 

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    Initialize();
}

Widget::~Widget()
{
    delete ui;

    if (!m_dataList.isEmpty())
    {
        const int iCnt = m_dataList.count();
        for (int i = 0; i < iCnt; ++i)
        {
            delete m_dataList[i];
            m_dataList[i] = NULL;
        }

        QList empty;
        empty.swap(m_dataList);
    }
}

void Widget::Initialize()
{
    ui->comboBox->setStyleSheet("QComboBox { min-height: 30px; min-width: 60px; }"
                                "QComboBox QAbstractItemView::item { min-height: 30px; min-width: 60px; }");
    ui->comboBox->setView(new QListView());

    CreateComboBoxData();

    LoadDataToComboBox();
}

void Widget::CreateComboBoxData()
{
    for (int i = 0; i < 5; ++i)
    {
        MyData *pMydata = new MyData(i + 1,
                                     QString("00%1").arg(i + 1),
                                     QString("%1号").arg(i + 1));
        m_dataList.push_back(pMydata);
    }
}

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)) );
}

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

 

demo下载地址点击打开链接

你可能感兴趣的:(C/C++)