在开发过程中,经常看别的软件有这么个场景。在下拉菜单中显示的是中文名称,但是后台数据却用的是编码。比如操作员combobox,选中的名称是“小明”,但是保存数据库需要用小明的Id/Number,这时候我们就要通过小明然后对应到Id/Number。
那Qt中ComboBox当然不能少了这个功能。QComboBox可以设置Item的Data,然后根据你选择的某一项可以对应到这个Data上。
效果图:
思路:
先定义好自己的数据结构 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下载地址点击打开链接