优化代码/实现 "for" 循环而不是长 "if - else if - else"
Optimization of code / implementing "for" loop instead of long "if - else if - else"
简单说一下我的QT GUI C++程序,
我有 4 个标签,label1
、label2
、label3
、label4
和一个 spinBox
、comboBox
和 pushButton
.
函数式(用户操作逻辑)示例,
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,但您的代码会更长且可读性较差。
简单说一下我的QT GUI C++程序,
我有 4 个标签,label1
、label2
、label3
、label4
和一个 spinBox
、comboBox
和 pushButton
.
函数式(用户操作逻辑)示例,
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,但您的代码会更长且可读性较差。