Qt 如何将命令行参数逐字传递给QProcess?
如何将当前进程的命令行参数传递给Qt 如何将命令行参数逐字传递给QProcess?,qt,command-line-arguments,qprocess,Qt,Command Line Arguments,Qprocess,如何将当前进程的命令行参数传递给QProcess,理想情况下避免任何转换?也就是说,传递给当前进程的任何“垃圾”都应该传递给子进程,而不受char*、wchar\u t和QString之间转换的影响 此问题的动机是。Windows GetCommandLine()返回的本机命令行是一个以可执行文件名/路径开头的wchar\u t数组QProcess在Windows上提供了setNativeArguments方法,该方法可用于在命令行中附加参数部分。然后,主要工作是找到参数的开头: QString
QProcess
,理想情况下避免任何转换?也就是说,传递给当前进程的任何“垃圾”都应该传递给子进程,而不受char*
、wchar\u t
和QString
之间转换的影响
此问题的动机是。Windows
GetCommandLine()
返回的本机命令行是一个以可执行文件名/路径开头的wchar\u t
数组QProcess
在Windows上提供了setNativeArguments
方法,该方法可用于在命令行中附加参数部分。然后,主要工作是找到参数的开头:
QString getWindowsCommandLineArguments() {
const wchar_t *args = GetCommandLine();
bool oddBackslash = false, quoted = false, whitespace = false;
// skip the executable name according to Windows command line parsing rules
while (auto c = *args) {
if (c == L'\\')
oddBackslash ^= 1;
else if (c == L'"')
quoted ^= !oddBackslash;
else if (c == L' ' || c == L'\t')
whitespace = !quoted;
else if (whitespace)
break;
else
oddBackslash = false;
args++;
}
return QString::fromRawData(reinterpret_cast<const QChar*>(args), lstrlen(args));
}
其他平台
与setNativeArguments
等效的参数在其他平台上不可用,因此我们最好通过QString
往返传递参数。只要参数在当前8位编码中有效,这就可以正常工作。必须在main
的开头捕获参数,因为Qt可能会删除它自己解释的参数:
QStringList &setProcessArguments() {
static QStringList args;
return args;
}
const QStringList &processArguments() { return setProcessArguments(); }
int main(int argc, char **argv) {
setProcessArguments().reserve(argc-1);
for (int i = 1; i < argc; ++i)
setProcessArguments().append(QString::fromLocal8Bit(argv[i]));
QCoreApplication app{argc, argv}; // may modify argc, argv
...
}
QProcess process;
process.setArguments(processArguments());
QStringList&setProcessArguments(){
静态QStringList参数;
返回args;
}
const QStringList&processArguments(){return setProcessArguments();}
int main(int argc,字符**argv){
setProcessArguments().reserve(argc-1);
对于(int i=1;i
QStringList &setProcessArguments() {
static QStringList args;
return args;
}
const QStringList &processArguments() { return setProcessArguments(); }
int main(int argc, char **argv) {
setProcessArguments().reserve(argc-1);
for (int i = 1; i < argc; ++i)
setProcessArguments().append(QString::fromLocal8Bit(argv[i]));
QCoreApplication app{argc, argv}; // may modify argc, argv
...
}
QProcess process;
process.setArguments(processArguments());