优化代码/实现“for”循环而不是长“if - else if - else”

时间:2015-03-16 05:50:55

标签: c++ for-loop qt4

简要介绍一下我的QT GUI C ++程序,

我有4个标签,label1label2label3label4spinBoxcomboBoxpushButton

功能(用户操作逻辑)示例

if spinBox value = 1, on pushButton click, current comboBox index (text) = my_stringarray[0]
if spinBox value = 2, on pushButton click, current comboBox index (text) = my_stringarray[1]
if spinBox value = 3, on pushButton click, current comboBox index (text) = my_stringarray[2]
if spinBox value = 4, on pushButton click, current comboBox index (text) = my_stringarray[3]

现在,spinBox绑定为1-4(即参考四个qlabels label1 to 4),comboBox索引为“RED”,“GREEN”,“BLUE” ,“黄色”

所需的输出逻辑是>

if my_stringarray[0] is RED set label1 color RED
if my_stringarray[0] is GREEN set label1 color GREEN
if my_stringarray[0] is BLUE set label1 color BLUE
if my_stringarray[0] is YELLOW set label1 color YELLOW
.
.
. and so on.

我也通过一长串if - else if - else命令来实现这一点,这些命令正在完成工作,但似乎并不合适。所以我希望为它实现一个for循环解决方案,但是无法弄清楚如何正确初始化循环参数。

我的新手循环参数初始化问题的任何帮助/指南都非常感谢。

Original code with "if - else if - else"

//for label1 color

if(settingsdialog->m_mystringarray[0]=="RED"
{
    ui->label1->setStyleSheet("QLabel{background-color: rgb(255, 0, 0)}");
    ui->label1->setText("I AM RED");
    qDebug()<<"label1 set RED";
}

else if(settingsdialog->m_mystringarray[0]=="GREEN"
{
    ui->label1->setStyleSheet("QLabel{background-color: rgb(0, 255, 0)}");
    ui->label1->setText("I AM GREEN");
    qDebug()<<"label1 set GREEN";
}

else if(settingsdialog->m_mystringarray[0]=="BLUE"
{
    ui->label1->setStyleSheet("QLabel{background-color: rgb(0, 0, 255)}");
    ui->label1->setText("I AM BLUE");
    qDebug()<<"label1 set BLUE";
}

等等等等......作为设置文本,我认为只有for循环可以成为我的救赎......

1 个答案:

答案 0 :(得分:3)

您可以将std::map关联字符串用于数字:

static std::map<std::string,int> mapcolors;

你会初始化它,例如与

mapcolors["RED"]= RedColor;
mapcolors["BLUE"] = BlueColor;

我建议C++11中的代码并升级到Qt5 (特别是因为C ++ 11是旧版本的巨大胜利 C ++)。您甚至可能将颜色设置为enum class(然后相应地更改mapcolors的声明)

顺便说一句,您实际的性能问题可能是ui->label1->setStyleSheet("QLabel{background-color: rgb(0, 255, 0)}");在运行时的使用,因为setStyleSheet必须“解释”"QLabel{background-color: rgb(0, 255, 0)}"字符串。它可能不是十几个if比较字符串的序列(或者甚至可能是两百个!)。也许您应该使用一些std::map<std::string,QStyle*> mapstyles代替

auto it = mapstyles.find(settingsdialog->m_mystringarray[0]);
if (it != mapstyles.end())
   ui->label1->setStyle(it->second);

你甚至可以更好地关联样式和标签文本,并有一些std::map<std::string,std::pair<Style*,std::string>> maplook;等...该对的第二个元素是字符串标签(可能是一些QString而不是{{1 }})

通过一些努力,您可以使用C ++ 98将此解决方案改编为较旧的Qt4,但您的代码会更长,可读性更低。