如何在Qt中为字符串编写switch语句?

时间:2013-09-29 18:16:37

标签: c++ qt dictionary switch-statement

我需要使用Qt为C ++中的字符串创建等效的switch / case语句。我相信最简单的方法是这样的(伪代码)

enum colours { red, green, blue };
QString array[] colour_names = { "red", "green", "blue" };
switch (color_names[user_string]) {
  case red: answer="Chose red";
  case green: answer="Chose green";
  case blue: answer="Chose blue";
  other: answer="Invalid choice";
}

但这并没有利用Qt的一些功能。我已经阅读了QStringList(用于在字符串列表中查找字符串的位置)和std:map(请参阅How to easily map c++ enums to strings,我不完全理解)。

有没有更好的方法来切换字符串?

3 个答案:

答案 0 :(得分:3)

switch()与字符串一起使用的唯一方法是使用字符串的整数值散列。您需要预先计算要比较的字符串的哈希值。例如,这是在qmake中用于读取可视工作室项目文件的方法。

重要提示:

  1. 如果您关心与其他字符串的哈希冲突,那么您需要比较案例中的字符串。不过,这仍然比做(N / 2)字符串比较便宜。

  2. qHash在QT 5中被重新设计,哈希与Qt 4不同。

  3. 不要忘记交换机中的break语句。您的示例代码错过了,并且还具有无意义的切换值!

  4. 您的代码如下所示:

    #include <cstdio>
    #include <QTextStream>
    
    int main(int, char **)
    {
    #if QT_VERSION < QT_VERSION_CHECK(5,0,0)
        static const uint red_hash = 30900;
        static const uint green_hash = 7244734;
        static const uint blue_hash = 431029;
    #else
        static const uint red_hash = 112785;
        static const uint green_hash = 98619139;
        static const uint blue_hash = 3027034;
    #endif
    
        QTextStream in(stdin), out(stdout);
        out << "Enter color: " << flush;
        const QString color = in.readLine();
        out << "Hash=" << qHash(color) << endl;
    
        QString answer;
        switch (qHash(color)) {
        case red_hash:
            answer="Chose red";
            break;
        case green_hash:
            answer="Chose green";
            break;
        case blue_hash:
            answer="Chose blue";
            break;
        default:
            answer="Chose something else";
            break;
        }
        out << answer << endl;
    }
    

答案 1 :(得分:1)

QStringList menuitems;
menuitems << "about" << "history";

switch(menuitems.indexOf(QString menuId)){
case 0:
    MBAbout();
    break;
case 1:
    MBHistory();
    break;
}

答案 2 :(得分:0)

我在另一个网站上发现了一个使用QStringList颜色的建议,在交换机中使用IndexOf(),然后在case语句中使用枚举值