如果参数列表中的路径有空格, QProcess不起作用



我想使用QProcess执行以下命令,如果执行,它已经在cmd中工作:

C:\myApplication\tools\dcmodify.exe -v -ie -gin -nb -ma (0010,0010)=TestedData "C:Usersuser.nameDocumentsMy Tools DataTempDemo Phantom Skindicom*"

第一个参数给出了可执行文件的路径,定义为QString:

QString srcToolPath = QDir::toNativeSeparators(QDir::cleanPath(qApp->applicationDirPath() + Constants::TOOLS_PATH + QDir::separator() + toQString("dcmodify.exe")));

参数列表和路径(应该在其中执行可执行文件)定义为QStringList:

QString dstDicomPath = QDir::cleanPath(Utilities::getTempPath() + QDir::separator() + toQString("Anon_") + QDateTime::currentDateTime().toString(Constants::DETAILED_DATE_TIME_FORMAT)) + QDir::separator();
QStringList argumentList;
argumentList <<
toQString(" -v") <<
toQString(" -ie") <<
toQString(" -gin") <<
toQString(" -nb") <<
toQString(" -ma (0010,0010)=TestedData") << 
toQString(" "") + QDir::toNativeSeparators(dstDicomPath) + toQString("*"");

,进程启动:

QProcess anonymizerProcess;
anonymizerProcess.start(srcToolPath, argumentList);

由于dstDicomPath包含一些空白,我在它周围添加了引号。虽然命令被执行,不知何故我没有得到像cmd的结果。我做错了什么dstDicomPath字符串?

好吧,有多个未知数,例如toQString()在您的代码中做什么,但没关系。让我们先假设这个命令是正确的,并且如果从命令行调用它就可以工作:

C:myApplicationtoolsdcmodify.exe -v -ie -gin -nb -ma (0010,0010)=TestedData "C:Usersuser.nameDocumentsMy Tools DataTempDemo Phantom Skindicom*"

现在让我们看看QProcess::splitCommand()返回什么(注意,我通过前置反斜杠转义了命令中的反斜杠和引号):

QString cmd= "C:\myApplication\tools\dcmodify.exe -v -ie -gin -nb -ma (0010,0010)=TestedData "C:\Users\user.name\Documents\My Tools Data\Temp\Demo Phantom Skin\dicom\*"";
qDebug() << QProcess::splitCommand(cmd);

它显示

("C:\myApplication\tools\dcmodify.exe", "-v", "-ie", "-gin", "-nb", "-ma", "(0010,0010)=TestedData", "C:\Users\user.name\Documents\My Tools Data\Temp\Demo Phantom Skin\dicom\*")

…这正是您需要传递给programarguments以调用QProcess::start()的内容。因此:

auto program = QString("C:\myApplication\tools\dcmodify.exe");
auto arguments = QStringList() << "-v" << "-ie" << "-gin" << "-nb" 
<< "-ma" << "(0010,0010)=TestedData" 
<< "C:\Users\user.name\Documents\My Tools Data\Temp\Demo Phantom Skin\dicom\*";
QProcess process;
process.start(program, arguments);

所以这里的信息是,您不需要尝试自己修复关于空白字符串的引号。Qt会自动帮你完成。您所需要的只是正确地分割程序和参数,以便Qt知道在哪里放置引号。

最新更新