[英]Embedded double quotes work in QT 4.7.4 not in 4.8.6
我有一個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版本中,12個字符串作為argv
一部分傳遞給QApplication。
當我通過版本4.7.4中的theApp.arguments()
獲取參數時,我返回所有參數,格式沒有變化。
但是,當我將相同的argumetns傳遞給版本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
解析中的Qt 4.8.6模板中的qWinCmdLine<>()
(來自qcorecmdlineargs_p.h
)。
在Qt 4.7.4中,該函數中處理命令行上的轉義引號的代碼部分看起來像(左欄中的注釋是我的注釋):
if (*p == '\\') { // escape char?
/* skip escape */ p++;
if (*p == Char('\"') || *p == Char('\''))
/* keep quote */ ; // yes
else
/* else undo */ p--; // treat \ literally
} else {
if (!quote && (*p == Char('\"') || *p == Char('\''))) { // " or ' quote
/* note and */ quote = *p++;
/* skip quote */ continue;
} else if (QChar((short)(*p)).isSpace() && !quote)
break;
}
在Qt 4.8.6中,該函數的該部分如下所示:
if (*p == '\\') { // escape char?
/* BUG */ if (*(p+1) == quote)
p++;
} else {
if (!quote && (*p == Char('\"') || *p == Char('\''))) { // " or ' quote
quote = *p++;
continue;
} else if (QChar((short)(*p)).isSpace() && !quote)
break;
這些片段非常相似,只是4.8.6代碼試圖通過跳過轉義字符來更加聰明,如果它看到下一個字符是quote
而不是4.7.4跳過轉義字符然后撤消該操作的技術它注意到了下一個字符不是'\\"'
或'\\'
。問題是,在該行我注釋為/* BUG */
,變量quote
僅如果你已經內引用設置它沒有正確處理不在命令行的引用部分中的轉義引號字符。
請注意,在Qt 4.8.6和Qt 5.3.1之間的某個時間, qWinCmdLine<>()
函數不再用於桌面Windows目標(它僅用於WinCE目標)。 相反,Win32 API CommandLineToArgvW()
用於將命令行解析為argv
數組 - 看起來它會帶回您正在尋找的行為(看起來該錯誤在僅WinCE版本的qWinCmdLine<>()
得到qWinCmdLine<>()
)。
因此,為了解決您的問題,您需要使用除4.8.6之外的Qt版本(我不確定錯誤在哪個版本中悄悄進入或者確切地修復了它),或者您可以修補qcorecmdlineargs_p.h
文件如果由於某種原因需要4.8.6,請重建Qt。
另請注意,在Windows上, QCoreApplication
(以及QApplication
)會忽略您傳入的argc
和argv
參數。解析的命令行始終從Win32 API GetCommandLine()
。 雖然記錄了這種行為,但當我嘗試通過將不同的argc
/ argv
值傳遞給QCoreApplication
來測試時,它並不是我所期望的並且有點令人惱火。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.