【发布时间】:2015-05-01 14:26:31
【问题描述】:
我有一个 Qt 4.7.4 应用程序正在运行。我正在尝试更新到 Qt 4.8.6,但是 4.8.6 版本不能像 4.7.4 那样处理嵌入式双引号。
例如,以下字符串是我们用作 QApplication 参数的十二个字符串之一:
QString myData =
QString("{\"type\":\"IndexFlt\",\"media\":\"1\",\"entityid\":\"0:0:0\"}");
在版本 4.7.4 中,十二个字符串作为 argv 的一部分传递给 QApplication。
当我在 4.7.4 版本中通过 theApp.arguments() 取回参数时,我会取回所有参数而格式没有变化。
但是,当我将相同的参数传递给版本 4.8.6 然后调用 theApp.arguments() 时,QStringList 只有六个条目而不是十二个。
当我查看第 6 个字符串时,我看到 QT 接受了参数 7-12 并将它们添加到前六个字符串中。
我在调试器中看到的 QStringList 参数在 4.7.4 和 4.8.6 之间是不同的。在 4.7.4
我认为论点 6 为:
"{"type":"IndexFlt","media":"1","entityid":"0:0:0"}"
但是对于 4.8.6 版本,我将参数 6 视为:
"{\type":"IndexFlt","media":"1","entityid":"0:0:0"} --ScriptArg:...
如您所见,字符串 type 前面不是双引号,而是/,而在将参数 7-12 添加到参数 6 后,结束 } 没有得到 "。
关于如何解决这个问题的任何想法?应用程序中唯一改变的是 Qt 的版本。
您可以使用以下代码查看嵌入双引号的问题。 只需确保在第一个参数中使用至少两个参数 包含嵌入的双引号。例如,如果下面的代码是 编译成一个名为 test.exe 的 exe,然后你可以这样调用 test.exe: test.exe --DoubleQuotes="true" -NoDoubleQuotes=false
#include <QtGui/QApplication>
#include <QtCore/QStringList>
#include <iostream>
int main(int argc, char** argv)
{
for (int i=0; i < argc ; i++)
{
std::string tmp = argv[i];
std::cout << tmp << std::endl;
}
QApplication theApp(argc, argv);
QStringList vArgs = theApp.arguments();
foreach (QString t, vArgs)
{
std::cout << t.toStdString() << std::endl;
}
}
【问题讨论】:
-
请发布一个小型的单一源文件程序来重现该问题。
-
我正在尝试显示更多代码,但这可能是不允许的。但是,我找到了一种更简单的方法来实现这一点。您只需要一个嵌入双引号的 argv,例如“--Somthing=\"TRUE\""。当您从 QT 应用程序中获取该参数时,您将看到“--Somthing=\TRUE”。看来 4.8.6 无法处理嵌入的双引号。
-
再次:请发布一个小型的单一源文件程序来重现该问题。否则,在尝试重现您所询问的内容时会涉及太多猜测(至少对我而言)。
-
感谢您的示例应用程序 - 我可以重现您的问题。我会试着仔细看看,但我不能保证我能做到多及时。