【问题标题】:How to run a windows cmd command using Qt?如何使用 Qt 运行 windows cmd 命令?
【发布时间】:2015-11-23 07:30:43
【问题描述】:

我必须使用 Qt 运行以下命令,这将弹出 Git GUI 窗口。

D:\MyWork\Temp\source>git gui

我该怎么做?

我尝试了以下方法,但没有成功:

QProcess process;   
process.start("git gui",QStringList() << "D:\MyWork\Temp\source>");

【问题讨论】:

    标签: c++ qt qprocess


    【解决方案1】:

    试试这个:

    QProcess process;
    process.setWorkingDirectory("D:\\MyWork\\Temp\\source");
    process.start("git", QStringList() << "gui");
    

    或者如果你想在一行中完成,你可以这样做(这里我们使用startDetached而不是start):

    QProcess::startDetached("git", QStringList() << "gui", "D:\\MyWork\\Temp\\source");
    

    在第二种情况下,最好检查返回码(如果您的程序无法运行外部程序,则显示错误消息)。您也可以将所有参数放在第一个 program 字符串中(即也允许使用 process.start("git gui");):

    bool res = QProcess::startDetached("git gui", QStringList(), "D:\\MyWork\\Temp\\source");
    if (!res) {
      // show error message
    }
    

    【讨论】:

    • 我尝试了所有这些,但我的 GUI 仍然没有弹出。 QProcess流程; process.setWorkingDirectory("D:\\MyWork\\Temp\\source"); process.start("git gui");
    • 1) 您能否再检查一次,但要提供 git.exe 的完整路径?像QProcess::startDetached("C:\\Users\\&lt;username&gt;\\AppData\\Local\\GitHub\\PortableGit_&lt;numbersandletters&gt;\\bin\\git.exe", QStringList() &lt;&lt; "gui", "D:\\MyWork\\Temp\\source"); 这样的东西? (请设置正确的路径!) 2)感谢您指出这一点,我修正了这个错误。
    • 我也试过用正确的exe路径,还是不行,不知道原因
    • 所以,尝试以同样的方式运行其他东西(如“notepad.exe”)。这样做只是为了确保这段代码至少可以在您这边运行(在我这边一切正常)。另外请检查路径周围是否有引号,以防其中有空格(例如"\"c:\\path with spaces\\prog.exe\")。
    【解决方案2】:

    我使用以下简单的代码段解决了我的问题

    #include <QDir>
    
    QDir::setCurrent("D:/MyWork/Temp/source");
    system("git gui");
    

    【讨论】:

    • 您是否也尝试从命令提示符回读响应?
    【解决方案3】:

    即使您使用的是 Qt,您仍然可以调用 Windows API。 ShellExecute 会做这项工作

    #include <Windows.h>
    ShellExecute(NULL, NULL, "git", "gui", NULL, SW_SHOWNORMAL);
    

    如果您的字符集是 Unicode(宽字符),请尝试以下代码

    #include <Windows.h>
    ShellExecute(NULL, NULL, _T("git"), _T("gui"), NULL, SW_SHOWNORMAL);
    

    【讨论】:

      【解决方案4】:

      您不必担心分隔符,Qt 会为您处理。

      QDir Document

      您不需要使用此函数来构建文件路径。如果你 总是使用“/”,Qt 会翻译你的路径以符合 底层操作系统。如果要向用户显示路径 使用他们的操作系统的分隔符使用 toNativeSeparators()。

      对于您的QProcess,试试这个。

      QProcess gitProcess;
      gitProcess.setWorkingDirectory("D:/MyWork/Temp/source");
      gitProcess.setProgram("git"); // hope this is in your PATH
      gitProcess.setArguments(QStringList() << "gui");
      gitProcess.start();
      if (gitProcess.waitForStarted()) {
        // Now your app is running.
      }
      

      【讨论】:

        【解决方案5】:

        我知道这篇文章现在有点老了,但我知道 Ilya 的回答有什么问题(据我了解)。由于QProcess 是在本地范围内创建的,因此每当您调用范围外的进程时,都会自动调用析构函数,并在此过程中终止该进程,正如调试消息所暗示的那样:

        在进程(“git”)仍在运行时销毁。

        解决此问题的一种方法是在堆上实际动态分配QProcess 的实例。确保在进程完成后释放内存。

        QProcess* process = new QProcess;
        process->setWorkingDirectory("D:\\MyWork\\Temp\\source");
        process->start("git", QStringList() << "gui");
        

        或者等到过程完成,使用

        process.waitForFinished (-1);
        

        我希望这对在这篇文章中寻找正确答案的人有所帮助。

        【讨论】:

          【解决方案6】:

          不要使用 system() 这样做,这样您就可以留在 QT 框架内:

          QDir::setCurrent("D:/MyWork/Temp/source");
          myProcess.startDetached("git gui");
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-04-14
            • 2023-03-17
            • 2018-03-14
            • 1970-01-01
            • 2018-03-15
            • 2017-08-07
            • 2014-12-28
            • 2011-07-12
            相关资源
            最近更新 更多