使用QProcess启动一个进程

8

我正在尝试使用以下方式使用QProcess启动Microsoft Word:

QString program = "WINWORD.EXE";
process->start(program);

但是什么也没有发生。 winword.exe在路径上(所以当我键入winword.exe时,Word会打开)。 这样做是正确的吗?

6个回答

18

也许下面的代码可以帮到你:

QProcess *process = new QProcess(this);
QString program = "explorer.exe";
QString folder = "C:\\";
process->start(program, QStringList() << folder);

我认为你正在尝试执行不在全局 $PATH Windows 变量中的程序,这就是为什么 winword.exe 无法执行的原因。

另外,你可能需要定义程序的绝对路径,例如:

QString wordPath = "C:\\Program Files\\Microsoft Office\\Office12\\WINWORD.EXE"
process->start(wordPath, QStringList() << "");

为什么在QStringList()的第二个参数中有一个空的 "" 字符串?我必须放这些,否则我的exe文件无法打开,但我不知道为什么。 - Zebrafish
@Zebrafish 这是一个参数。"" 表示空参数。 - mosg
这是因为如果您使用单参数重载且路径包含空格,则空格后的字符将被视为传递给可执行文件的参数或参数。使用两个参数的重载和空字符串使其明确第一个参数是可执行文件的完整路径,即使它包含空格,参数也严格作为其第二个参数传递。很令人困惑,我知道。 - Zebrafish

6
对于我来说,我需要添加“字符”:
m_process->start("\"C:\\Program Files (x86)\\Notepad++\\notepad++.exe\"");

1

来自Qt文档:

注:进程是异步启动的,这意味着已启动信号和错误信号可能会延迟。调用waitForStarted()以确保进程已启动(或无法启动),并且已发出那些信号。

将文档中提到的信号连接到某个GUI控件或调试输出,然后查看结果。如果有错误,您应该使用QProcess::error()检查错误类型。


1
如果你尝试启动外部进程的方法在你的代码之后立即完成,例如:
void foo() {
    ...
    QString program = "WINWORD.EXE";
    process->start(program);
}

和变量

process

被声明为局部变量,它将在方法结束时被销毁,并且不会启动任何外部进程 - 或者正确地说,您将看不到它,因为它将在启动后立即被销毁。

这是我遇到类似问题的原因。希望能有所帮助。


0
QProcess *pro = new QProcess;
QString s = "\"C:\Users\xyz\Desktop\Example.exe";
pro ->start(s);

1
虽然这可能回答了作者的问题,但它缺少一些解释性的词语和文档链接。裸代码片段没有周围的一些短语是不太有帮助的。您也可以发现如何撰写一个好的答案非常有帮助。请编辑您的答案。 - hellow

0

您可以直接设置工作目录:

myProcess = new QProcess();
myProcess->setWorkingDirectory("C:\\Z-Programming_Source\\Java-workspace\\Encrypt1\\bin\\");

或者在开始时执行:

myProcess->start("dir \"My Documents\"");

在 start() 函数中,您可以输入控制台命令...请阅读手册。

我更喜欢第一种选项。更易读。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接