【问题标题】:QProcess with 'cmd' command does not result in command-line window带有“cmd”命令的 QProcess 不会导致命令行窗口
【发布时间】:2017-02-05 11:16:17
【问题描述】:

我正在将代码从 MinGW 移植到 MSVC2013/MSVC2015 并发现一个问题。

QProcess process;
QString program = "cmd.exe";
QStringList arguments = QStringList() << "/K" << "python.exe";
process.startDetached(program, arguments);

当我使用 MinGW 时,此代码会导致命令行窗口。但是当我使用 MSVC2013 或 MSVC2015 时,相同的代码会导致 cmd-process 在后台运行而没有任何窗口。有没有办法让命令行窗口出现?

【问题讨论】:

  • 使用静态方法会发生什么,即使用QProcess::startDetached("cmd.exe", QStringList() &lt;&lt; "/K" &lt;&lt; "python.exe");
  • 同理:后台运行的cmd-process和子python-process
  • 问题与Qt5.8.0版本有关。

标签: qt visual-c++ cmd qprocess


【解决方案1】:

问题与 msvc2015 相关,与 Qt5.8.0 无关。有办法摆脱它。这个想法是使用 CREATE_NEW_CONSOLE 标志。

#include <QProcess>
#include <QString>
#include <QStringList>
#include "Windows.h"

class QDetachableProcess 
        : public QProcess {
public:
    QDetachableProcess(QObject *parent = 0) 
        : QProcess(parent) {
    }
    void detach() {
       waitForStarted();
       setProcessState(QProcess::NotRunning);
    }
};

int main(int argc, char *argv[]) {
    QDetachableProcess process;
    QString program = "cmd.exe";
    QStringList arguments = QStringList() << "/K" << "python.exe";
    process.setCreateProcessArgumentsModifier(
                [](QProcess::CreateProcessArguments *args) {
        args->flags |= CREATE_NEW_CONSOLE;
        args->startupInfo->dwFlags &=~ STARTF_USESTDHANDLES;
    });
    process.start(program, arguments);
    process.detach();
    return 0;
}

【讨论】:

    【解决方案2】:

    您不需要为此使用QProcess。直接使用std::system就简单多了:

    #include <cstdlib>
    
    // then when you want to open a 
    // detached command prompt:
    std::system("cmd");
    

    您还可以执行以下操作:

    std::system("cd some/path && cmd");
    

    它是标准 C++(来自 C),因此 std::system(...) 本身可以在任何平台上运行,您只需为每个平台设置 shell 命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      相关资源
      最近更新 更多