【问题标题】:Start a process using QProcess使用 QProcess 启动进程
【发布时间】:2010-04-12 14:39:49
【问题描述】:

我正在尝试使用QProcess 启动 Microsoft Word,如下所示:

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

但什么也没发生。 winword.exe 在路径上(所以当我输入 winword.exe 时,单词正在打开)。 这是正确的做法吗?

【问题讨论】:

    标签: qt qprocess


    【解决方案1】:

    下面的代码可能会对您有所帮助:

    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 这是一个参数。 "" 表示空参数。
    • 这是因为如果您使用单参数重载并且路径包含空格,则空格后面的字符将被视为传递给可执行文件的参数或参数。使用带有空字符串的双参数重载可以明确第一个参数是可执行文件的完整路径,即使它包含空格,并且参数严格作为其第二个参数传递。令人困惑,我知道。
    【解决方案2】:

    对我来说,我需要添加“字符:

    m_process->start("\"C:\\Program Files (x86)\\Notepad++\\notepad++.exe\"");
    

    【讨论】:

      【解决方案3】:

      来自 Qt 文档:

      注意:进程已启动 异步,这意味着 started() 和 error() 信号可能是 延迟。调用 waitForStarted() 使 确保该过程已开始(或已 未能启动)和那些信号 已发出。

      将文档中提到的信号连接到一些 GUI 控件或调试输出,看看会发生什么。如果有错误,你应该使用 QProcess::error() 检查错误类型。

      【讨论】:

        【解决方案4】:

        如果您尝试启动外部进程的方法在您的代码之后立即完成,例如:

        void foo() {
            ...
            QString program = "WINWORD.EXE";
            process->start(program);
        }
        

        和变量

        process
        

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

        在我的案例中,这是出现类似问题的原因。希望对您有所帮助。

        【讨论】:

          【解决方案5】:

          你可以只设置工作目录:

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

          或者一开始就做:

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

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

          我更喜欢第一个选项。更具可读性。

          【讨论】:

            【解决方案6】:
            QProcess *pro = new QProcess;
            QString s = "\"C:\Users\xyz\Desktop\Example.exe";
            pro ->start(s);
            

            【讨论】:

            • 虽然这可能会回答作者的问题,但它缺少一些解释性词语和文档链接。如果没有围绕它的一些短语,原始代码 sn-ps 并不是很有帮助。您可能还会发现how to write a good answer 非常有帮助。请编辑您的答案。