在我的项目中,我制作了一个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()命令时,是否需要对路径进行任何更改?
答案 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)
QDesktopServices::openUrl()
。此功能允许操作系统从默认程序列表中为您选择文件类型。
虽然您也可以使用该功能打开可执行文件(例如控制台程序),但是使用QProcess
可以替代它。如果您不需要与控制台程序通信或等待它完成,您可以使用两个QProcess::startDetached()
静态函数之一以一种即发即忘的方式启动它
答案 4 :(得分:-3)