1

在我的项目中,我制作了一个 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"));

控制台窗口没有出现,但是,程序根本没有被调用。使用橄榄的技术而不是我原来的 system() 命令时,是否需要对路径进行任何更改?

4

5 回答 5

2

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

system("start program.exe -d inputFile.dat outputPath");
于 2013-08-19T11:26:26.580 回答
1

我这样解决了这个问题:

QProcess::execute("启动程序.exe -d inputFile.dat outputPath");

问题是,我只能这样做一次。每次我尝试再次调用它时,它都不起作用。隐藏起来的东西是“开始”。把它拿出来可以看到控制台,它只是空白。

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

于 2013-08-19T12:12:03.753 回答
0

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

因此,通过改进错误处理来实现,如果进程没有启动/退出错误或等待进程完成任务..我认为这很有用

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

当前代码正在使用 start() API,但或多或​​少的功能类似于 execute..

代码是从SO复制而来的,并且针对当前要求进行了少量修改。

> 主窗口.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);

}

主窗口.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();
}
于 2013-08-19T10:58:00.473 回答
0

QDesktopServices::openUrl()如果您希望在查看或编辑程序中打开文档(例如 PDF 文档、网页)并且您不确定安装了哪些程序,通常使用此选项。此功能允许操作系统从默认程序列表中选择与文件类型相关的内容。

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

QProcess::startDetached

于 2013-08-19T12:21:02.360 回答
-3

在您的 Qt 程序中,有一个 .pro 文件。您可以将此行添加到文件中:config+=console

于 2013-08-19T11:04:30.533 回答