2017-02-18 51 views
0

我想创建一个简单的Qt程序,让我推出AVRDUDE不使用命令行操作。另外,QProcess和AVRDUDE

我看到有QProcess中很容易发动任何形式的节目,我与像资源管理器中的Word和其他简单的程序成功地尝试了。

的问题是,当我尝试打开cmd.exe的什么也没有发生,即使我尝试通过包含所有信息的批处理文件来启动正确AVRDUDE。

下面的代码

QProcess *process = new QProcess(this); 
process->startDetached("cmd.exe",QStringList()<<"C:/avrdude/avr.bat"); 
+0

请编辑您的帖子,以显示你是怎么批处理文件传递给''中QProcess' cmd.exe'。您可以使用包含'echo“Hello的批处理文件来构建可重现样本。 – Scheff

+0

感谢您的回复,我编辑了我的代码,正如您所看到的,我要求打开cmd.exe,然后我想传递我的批处理文件的绝对路径。在我的版本的绝对路径是由保存从Qfiledialog – Deid

+0

获得的路径看起来不坏一号一目了然的QString给出。 'cmd.exe'是否打开和关闭,还是保持打开状态?在前一种情况下,可以使用'/ K'作为第一个参数。我通过在'cmd.exe'中输入'help cmd'来发现这一点。 – Scheff

回答

1

我写了一个最小的示例应用程序,它展示了如何使用QProcess::startDetached()(上按一下按钮)使用命令启动cmd

// standard C++ header: 
#include <iostream> 

// Qt header: 
#include <QApplication> 
#include <QMainWindow> 
#include <QPushButton> 
#include <QProcess> 

int main(int argc, char **argv) 
{ 
    // main application 
#undef qApp // undef macro qApp out of the way 
    QApplication qApp(argc, argv); 
    QMainWindow qWin; 
    QPushButton qBtn(QString::fromLatin1("Start cmd")); 
    QObject::connect(&qBtn, &QPushButton::clicked, 
    [](bool) { 
     bool ret = QProcess::startDetached(
#if 1 // let Windows search for cmd.exe in %PATH% 
     QString::fromLatin1("cmd.exe"), 
#else // define exact path of cmd.exe 
     QString::fromLatin1("C:\\Windows\\system32\\cmd.exe"), 
#endif // 1 
     QStringList() 
     << QString::fromLatin1("/K") 
     << QString::fromLatin1("echo Hello")); 
     std::cout << "QProcess::startDetached():" 
     << (ret ? "OK." : "Failed!") << std::endl; 
    }); 
    qWin.setCentralWidget(&qBtn); 
    qWin.show(); 
    return qApp.exec(); 
} 

Qt的项目文件离开作为练习。 (对不起,我用CMake的这一点。)

请注意#if 1。如果将1替换为0,则使用具有完整路径的替代代码。 (在聊天期间,我们检查了启动cmd.exe的特殊问题。)在我的系统上,两种替代方案都是如此。

(我的操作系统:Windows 10,VS2013,QT 5.7)