如何在 Qt 中为字符串编写 switch 语句?
Posted
技术标签:
【中文标题】如何在 Qt 中为字符串编写 switch 语句?【英文标题】:How to write a switch statement for strings in Qt? 【发布时间】:2013-09-29 18:16:37 【问题描述】:我需要使用 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)。
有没有更好的方法来切换字符串?
【问题讨论】:
你不想使用枚举吗? 您不能在 switch 语句中使用字符串。你还没有告诉我们为什么你需要一个 swicth 声明。基于字符串的查找最简单的解决方案是使用映射。在 Qt 中,这意味着使用 QMapQMetaEnum
和QMetaObject
来完成,就像我的回答here 一样
【参考方案1】:
将switch()
与字符串一起使用的唯一方法是使用字符串的整数值散列。您需要预先计算要比较的字符串的哈希值。例如,这是 qmake 中用于读取 Visual Studio 项目文件的方法。
重要提示:
如果您关心与其他字符串的哈希冲突,那么您需要比较案例中的字符串。不过,这仍然比进行 (N/2) 次字符串比较便宜。
qHash
针对 QT 5 进行了重新设计,哈希值与 Qt 4 不同。
不要忘记开关中的break
语句。您的示例代码错过了这一点,并且还具有无意义的开关值!
您的代码如下所示:
#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;
【讨论】:
好的很酷的答案。你是如何得到你的哈希常量的? (您是否必须运行一个简单的程序才能将它们全部打印出来?) 是的,您可以编写一个小程序,从源代码中为您挑选出来。也许我稍后会把它添加到问题中。【参考方案2】:QStringList menuitems;
menuitems << "about" << "history";
switch(menuitems.indexOf(QString menuId))
case 0:
MBAbout();
break;
case 1:
MBHistory();
break;
【讨论】:
【参考方案3】:我在另一个网站上找到了使用颜色的 QStringList 的建议,在 switch 中使用 IndexOf(),然后在 case 语句中使用枚举值
【讨论】:
以上是关于如何在 Qt 中为字符串编写 switch 语句?的主要内容,如果未能解决你的问题,请参考以下文章