下列代码是QComboBox的简单应用,相信大部分人都会这样写。
QComboBox *m_comboBox;
m_comboBox = new QComboBox(this);
m_comboBox->addItem("16*16");
m_comboBox->addItem("32*32");
m_comboBox->addItem("64*64");
m_comboBox->addItem("128*128");
connect(m_comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onCurrentIndexChanged(int)));
connect(m_comboBox, SIGNAL(currentTextChanged(const QString &)), this, SLOT(onCurrentTextChanged(const QString &)));
/* 槽函数1 */
void onCurrentIndexChanged(int index)
{
/* 直接使用index判断在项数动态增加时会容易出错。 */
if (index == 0) {
qDebug() << "0: Do something." << QSize(16, 16);
}
else if (index == 1) {
qDebug() << "1: Do something." << QSize(32, 32);
}
}
/* 槽函数2 */
void onCurrentTextChanged(const QString &text)
{
/* 使用字符串判断可能会出现写错字符串导致一直判断不成功的问题。 */
if (text == "16*16") {
qDebug() << "0: Do something." << QSize(16, 16);
}
else if (text == "32*32") {
qDebug() << "1: Do something." << QSize(32, 32);
}
}
上面代码的实现维护性不好。
64*64
与128*128
之间添加一项时会导致下标改变,如不及时修改代码会出现程序意想不到的bug。那么我们该如何避免上面的这些问题呢?答案如下,看代码:
QComboBox *m_comboBox;
m_comboBox = new QComboBox(this);
m_comboBox->addItem("16*16", QSize(16, 16));
m_comboBox->addItem("32*32", QSize(32, 32));
m_comboBox->addItem("64*64", QSize(64, 64));
m_comboBox->addItem("128*128", QSize(128, 128));
m_comboBox->addItem("256*256", QSize(256, 256));
m_comboBox->addItem("512*512", QSize(512, 512));
connect(m_comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onCurrentIndexChanged(int)));
void onCurrentIndexChanged(int index)
{
/* 通过实现addItem绑定的数据通过index获取回来,方便易用,维护性高。 */
QSize size = m_comboBox->itemData(index).toSize();
qDebug() << "Do something." << size;
}
利用addItem
接口的userData
参数实现,而使用itemData
接口实现数据的获取。
void QComboBox::addItem(const QString &text, const QVariant &userData = QVariant())
QVariant QComboBox::itemData(int index, int role = Qt::UserRole) const