当gui程序向cli程序发送命令时隐藏控制台窗口?

时间:2013-08-19 10:35:31

标签: c++ qt hide system command-prompt

在我的项目中,我制作了一个GUI程序,偶尔会向cli程序发送命令。我是这样做的:

system("folder\\program.exe -d folder\\inputFile.dat folder\\outputPath");

显然没有这些名字,但你明白了。这工作正常,除非我的GUI程序发送这些命令,命令提示符窗口打开并执行cli程序应该执行的任何操作。它看起来非常糟糕且不洁净。

有什么方法可以“隐藏”cli程序窗口,但仍然可以默默地执行它需要做的事情吗?

感谢您的时间:)

编辑:我尝试使用橄榄的技术,即使用QDesktopServices和QUrl来调用程序:

QDesktopServices::openUrl(QUrl("folder\\program.exe -d folder\\inputFile.dat folder\\outputPath"));

控制台窗口没有显示,但是根本没有调用该程序。使用olive的技术而不是原始的system()命令时,是否需要对路径进行任何更改?

5 个答案:

答案 0 :(得分:2)

我无法确定您是否需要跨平台解决方案。在Windows上使用start执行通常会隐藏命令窗口。

system("start program.exe -d inputFile.dat outputPath");

答案 1 :(得分:1)

我这样解决了这个问题:

QProcess :: execute(“start program.exe -d inputFile.dat outputPath”);

问题是,我只能这样做一次。每次我试着再次打电话,它都行不通。使这个隐藏的事情是“开始”。取出它可以看到控制台,它只是空白。

似乎我需要一种方法来“结束”程序或其他任何再次运行它之前。 (我说或者其他什么因为我不知道为什么/为什么在路径上添加“开始”)

答案 2 :(得分:0)

很抱歉误导了QDesktopService :: URL,后来我明白它不会接受参数。

通过改进错误处理,如果进程没有开始/退出严重或等待进程完成任务而实现..我认为这很有用

在QProcess中,execute是阻塞线程,但是start正在恢复线程。

当前代码使用的是start()API,但或多或​​少都是像execute ..

这样的特征
  

代码从SO复制,并根据当前要求进行少量修改。

<强>&GT; Mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QProcess>
#include <QShortcut>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    cameraControl = new QProcess(this);

}

MainWindow::~MainWindow()
{
    delete ui;
    cameraControl->close();
    delete cameraControl;
}


void MainWindow::on_pushButton_clicked()
{
    // connect the camera control finished signal to the slot that will read the exit code and
    // place the std output string from the process into a label on the form
    connect(cameraControl, SIGNAL(finished(int , QProcess::ExitStatus )),
            this, SLOT(on_cameraControlExit(int , QProcess::ExitStatus )));

    // Disable the ui button do we don't get double presses
    ui->pushButton->setDisabled(true);

    // setup the gphoto2 arguments list
    QStringList args;
    args.append("d:\\text.txt");

    // start the camera control
    cameraControl->start("notepad",args);

//    // wait for the process to finish or 30 seconds whichever comes first
    cameraControl->waitForFinished(30000);

}



void MainWindow::on_cameraControlExit(int exitCode, QProcess::ExitStatus exitStatus)
{
    qDebug() << cameraControl->errorString();
    qDebug() << cameraControl->readAllStandardError();
    qDebug() << cameraControl->readAllStandardOutput();
    ui->pushButton->setEnabled(true);

}

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QString>
#include <QProcess>
#include <QObject>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void reply2();


private slots:
    void on_pushButton_clicked();
    void on_cameraControlExit(int exitCode, QProcess::ExitStatus exitStatus);


private:
    Ui::MainWindow *ui;
    QProcess* cameraControl;

};

#endif // MAINWINDOW_H

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

答案 3 :(得分:0)

如果您希望在查看或编辑程序中打开文档(例如PDF文档,网页)并且您不确定已安装了哪些程序,则通常使用

QDesktopServices::openUrl()。此功能允许操作系统从默认程序列表中为您选择文件类型。

虽然您也可以使用该功能打开可执行文件(例如控制台程序),但是使用QProcess可以替代它。如果您不需要与控制台程序通信或等待它完成,您可以使用两个QProcess::startDetached()静态函数之一以一种即发即忘的方式启动它

QProcess::startDetached

答案 4 :(得分:-3)

在您的Qt程序中,有一个.pro文件。您可以将此行添加到文件中: 配置+ =控制台

相关问题