简要介绍一下我的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” ,“黄色”
所需的输出逻辑是>
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
循环可以成为我的救赎......
答案 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,但您的代码会更长,可读性更低。