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

Optimization of code / implementing "for" loop instead of long "if - else if - else"

简单说一下我的QT GUI C++程序,

我有 4 个标签,label1label2label3label4 和一个 spinBoxcomboBoxpushButton.

函数式(用户操作逻辑)示例,

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"、"YELLOW"

所需的输出逻辑是->

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循环才能拯救我……

您可以使用 std::map 将字符串与数字相关联:

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

您将初始化它,例如与

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

我建议 C++11 and upgrade to Qt5 (notably because C++11 is a huge win w.r.t. older versions of C++). You might even have the color be some enum class 中编写代码(然后相应地更改 mapcolors 的声明)

顺便说一句,您的实际性能问题可能是在运行时使用 ui->label1->setStyleSheet("QLabel{background-color: rgb(0, 255, 0)}");,因为 setStyleSheet 必须 "interpret" "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 而不是 std::string)

通过一些努力,您可以使用 C++98 使此解决方案适用于较旧的 Qt4,但您的代码会更长且可读性较差。