我想使用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\*")
…这正是您需要传递给program
和arguments
以调用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知道在哪里放置引号。