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

C++ gui程序向cli程序发送命令时隐藏控制台窗口?,c++,qt,hide,system,command-prompt,C++,Qt,Hide,System,Command Prompt,在我的项目中,我制作了一个GUI程序,它偶尔会向cli程序发送命令。我是这样做的: system("folder\\program.exe -d folder\\inputFile.dat folder\\outputPath"); 显然没有这些名字,但你明白了。这可以正常工作,除非GUI程序发送这些命令,否则会打开一个命令提示窗口,并执行cli程序应该执行的任何操作。它看起来很糟糕,很不干净 是否有任何方法可以隐藏cli程序窗口,但仍让它以静默方式执行需要执行的操作 感谢您抽出时间: 编辑:

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

system("folder\\program.exe -d folder\\inputFile.dat folder\\outputPath");
显然没有这些名字,但你明白了。这可以正常工作,除非GUI程序发送这些命令,否则会打开一个命令提示窗口,并执行cli程序应该执行的任何操作。它看起来很糟糕,很不干净

是否有任何方法可以隐藏cli程序窗口,但仍让它以静默方式执行需要执行的操作

感谢您抽出时间:

编辑:我尝试了olive的技术,即使用QDesktopServices和QUrl调用程序:

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

控制台窗口没有显示,但是程序根本没有被调用。当使用olive的技术而不是我原来的系统命令时,是否需要对路径进行任何更改?

很抱歉使用QDesktopService::URL误导您,后来我了解到它不会接受参数

因此,通过改进错误处理来实现,如果流程启动/退出不好,或者等待流程完成任务……我认为这是有用的

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

当前代码使用的是start API,但或多或少都有类似于execute的特性

代码是从当前需求中复制的,并且很少修改

>Mainwindow.cpp

主窗口

#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();
}

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

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

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

我这样解决了这个问题:

QProcess::executestart program.exe-d inputFile.dat outputPath

问题是,我只能这样做一次。每次我试着再打一次电话,它都不起作用。让这个隐藏起来的是开始。取出它可以看到控制台,它只是一片空白

似乎我需要一种方法来结束程序或其他什么,然后再运行它。我之所以这样说,是因为我不知道向路径添加start会做什么/为什么

QDesktopServices::openUrl通常用于在查看或编辑程序中打开文档(如PDF文档、网页),而您不确定安装了哪些程序。此函数允许操作系统从文件类型的默认程序列表中为您选择

尽管您也可以使用该函数打开可执行文件(如控制台程序),但另一种方法是使用QProcess。如果您不需要与console程序通信或等待它完成,您可以使用两个QProcess::startDetached静态函数中的一个以fire and forget的方式启动它


你的意思是说,你想从你的GUI应用程序启动另一个进程吗?不是真的。我有一个可以向其发送命令的外部.exe。我刚刚制作了一个GUI,偶尔会运行那些命令行程序,但我不希望出现命令提示符窗口。在启动时发送命令意味着program.exe的参数?是的。例如,如果我想解压缩一些东西,我会这样做:systemprogram.exe-decompress inputFile.dat outputPath;很有魅力:非常感谢你:事实上,没有。它什么也没做。你把c:\\?包括在内有什么原因吗???我的意思是,这个程序似乎从未运行过。编辑:我看到您添加了~仍然没有任何内容。@mc360pro删除了硬编码路径,您可以根据您的系统环境给出/或直接给出您的路径。我使用的路径与我的系统命令中的路径相同。我也搞砸了。它好像什么都没做。hmmm:/使用此命令而不是原始系统命令时,是否需要对路径进行任何更改?因为程序在我用系统调用它时运行。@我想说的是,上面的答案对这个问题没有任何意义。没有。事实上,它似乎显示了两个窗口,然后它似乎没有正常运行。@mc360pro:好的。然后,当通过系统执行时,它的行为会有所不同。对于主应用程序本身的启动,我知道它是有效的。此外,它确实运行了,但我的下一行打开新创建的文件似乎无法工作,因为我猜它从未等到cli程序完成后才继续。@mc360pro:我将使用QProcess并捕获完成的信号。然后打开文件。如果不是所有写入的内容都被刷新到磁盘上,可能仍然会出现过早的打开。我正在采取另一种方法。事实上,我使用了QProcess::execute,它的工作原理与系统相同,但这次命令提示符窗口在瞬间打开,为空。尽管如此,我不想这样做,但它更接近。程序通常应该在完成后结束,但是你打开文件。这样可以防止过度书写。除此之外,我没有任何线索,因为我95%的时间都在使用linux。
system("start program.exe -d inputFile.dat outputPath");