【问题标题】:Why can't I pass arguments with QProcess when launching blender?为什么我不能在启动搅拌机时使用 QProcess 传递参数?
【发布时间】:2023-07-11 10:06:01
【问题描述】:

尝试在 QT 控制台应用程序的 main 函数中运行此代码,但它只启动 Blender GUI。这些参数应该开始后台渲染。

我测试了参数是否正确,它们在 CMD 上运行良好。这似乎是搅拌机特有的问题,但我可能错了。似乎,使用 QProcess 它不允许 Blender 使用参数。它在不传递任何参数的情况下启动应用程序。

QProcess myProcess;
QString blender = "C:/Program Files/Blender Foundation/Blender/blender.exe";
QStringList arguments;
  arguments << "blender" << "-b" << "E:/my/file.blend" << "-o" << " E:/my/output/folder/"<< "-a";

myProcess.start(blender,arguments);

编辑:

所以浏览 SO,我发现了一些可以工作的东西,但这不是使用 QT 功能。我宁愿找到这样做的QT方式。它本质上是在运行 CMD 并通过 CMD 启动搅拌机。有没有办法使用 QT 做到这一点?

QDir::setCurrent(blender);
system("blender -b E:\\Blender\\BlendSwap\\55510_Ciclos_Town_-_10_Male_Characters\\cidade_ciclos-bonecos.blend -o E:\\Blender\\BlendSwap\\55510_Ciclos_Town_-_10_Male_Characters\\exp\\frame_### -a");

【问题讨论】:

  • 愚蠢的问题但是...arguments 中的第一项“搅拌机”是什么?
  • 不要忘记,如果QProcessmyProcess 实例被销毁,启动的进程将自动终止。为避免这种情况,您可以使用startDetached 而不是start 或在启动该过程后运行QProcess::waitForFinished()
  • 不,这实际上是一个好点。在 CMD 中,您将 CD 到搅拌机文件夹,“搅拌机”是启动搅拌机的标志。我不知道出了什么问题,但 QProcess 的工作如此不稳定。有时它会启动搅拌机 gui,有时它根本不会启动任何东西。有几次它在 GUI 中启动了实际项目。注意:我一直在试验项目路径的“\”和“/”。似乎它喜欢一个,但我无法重现这个问题。
  • @G 好的,我重现了这个问题。这很奇怪。它不喜欢让它在后台运行的“-b”标志。您在 -b 代码中看到的空间实际上使程序跳过了该标志。长话短说,我实际上可以将我的项目文件作为参数传递,它会运行良好。我唯一的解决方案是运行 CMD 并通过它运行搅拌机吗?
  • @MaxGo 感谢您输入 Max。现在我发现它不喜欢我的论点,我发现 startDetached() 正在启动搅拌机,就像 start() 一样。我尝试阅读文档以获取您的建议,但我不明白它的实际含义是什么? waitForFinished 似乎建议它应该作为一个单独的线程启动,否则它会锁定程序并启动分离我无法理解它的目的。

标签: qt blender qprocess


【解决方案1】:

感谢@MaxGo 和@G.M。因为他们让我走上了正确的道路。

两件事: 首先,确实使用“搅拌机”标志是问题之一。我无法启动 .exe 文件,还希望 blender 接受参数。

其次,start() 将不起作用,您需要使用 startDetached 或 execute() 才能使其工作。

以下是正确启动的最终代码。

QDir::setCurrent(blenderDirectory);
myProcess.startDetached("blender -b " + projectPath + " -o " + projectOutput + " -a");

【讨论】:

    最近更新 更多