在开发过程中,经常看别的软件有这么个场景。在下拉菜单中显示的是中文名称,但是后台数据却用的是编码。比如操作员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下载地址点击打开链接