gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:40:15 24 4
gpt4 key购买 nike

简单说一下我的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 被绑定(bind)到 1-4(即引用四个 qlabels label1 到 4)并且 comboBox 索引是“红”、“绿”、“蓝”、“黄”

所需的输出逻辑是->

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编码并升级到Qt5 (特别是因为 C++11 是 巨大的胜利 w.r.t. 旧版本的 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 而不是 std::string )

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

关于c++ - 优化代码/实现 "for"循环而不是长 "if - else if - else",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29070358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com