2013-08-19 103 views
1

在我的項目中,我製作了一個GUI程序,它偶爾會將命令發送給cli程序。我這樣做:當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")); 

控制檯窗口沒有顯示出來,但是,該程序根本沒有被調用。使用橄欖技術而不是我的原始系統()命令時是否需要對路徑進行任何更改?

+0

你的意思是說,你想從你的GUI應用程序啓動另一個進程? – Ashif

+0

不是。我有一個外部的.exe,我可以發送命令。我剛做了一個GUI,偶爾會運行這些命令行程序,但我不想彈出命令提示符窗口。 – mrg95

+0

發送命令是指啓動時program.exe的參數嗎? – Ashif

回答

0

對不起,誤導QDesktopService :: URL,後來我明白它不會接受參數。

所以,通過提高錯誤處理實現的,如果過程中不要啓動/退出不好或WAITFOR過程完成task..I認爲這是

QProcess中,執行阻塞的線程是有用的,但開始時恢復線。

當前代碼是使用開始()API,但更多或類似的執行更少featurewise ..

代碼從SO複製和修改小的電流要求。

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

工程就像一個魅力:)非常感謝:D – mrg95

+0

其實,沒有它沒有。它沒有做任何事情。是否有你包括c:\\ ???的原因我的意思是,程序似乎從未運行過。 編輯:我看到你加〜仍然沒有。 – mrg95

+0

@ mc360pro刪除硬編碼路徑,您可以根據您的系統環境給出您的路徑 – Ashif

-3
在你的Qt程序

,有一個.pro file.You可以添加這一行到文件中: config + = console

+2

這並沒有解決我的問題 – mrg95

+2

@Robin我想說,以上答案不會給問題增加任何價值。 – Ashif

2

我無法確定您是否需要跨平臺解決方案或不是。在使用開始的窗口執行通常隱藏命令窗口。

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

不。實際上,它似乎顯示了兩個窗口,然後似乎沒有正常運行。 – mrg95

+0

@ mc360pro:好的。然後在通過系統執行時表現不同。對於主應用程序本身的啓動,我知道它是有效的。 – user2672165

+0

此外,它確實運行,但它似乎像我的下一行(打開新創建的文件)無法正常工作,因爲(我猜在這裏)它從未等到cli程序完成後才繼續。 – mrg95

1

我解決這樣的問題,所以:

另外,QProcess ::執行( 「開始的Program.exe -d inputFile.dat outputPath」);

問題是,我只能這樣做一次。每次我嘗試再次調用它時,它都不起作用。讓這個隱藏的東西是「開始」。拿出它可以看到控制檯,它只是空白。

看來我需要一種方法來「結束」程序或任何其他的東西,然後再次運行它。(我說或別的,因爲我不知道什麼/爲什麼添加「開始」的路徑)

+0

程序通常應該在完成時結束,但隨後打開文件。這可以防止重寫它。除此之外,我沒有任何線索,因爲我95%的時間都在使用Linux。 – user2672165

+0

但是在使用system()時它怎麼工作? – mrg95

0

QDesktopServices::openUrl()通常用於如果您希望在查看或編輯中打開文檔(例如PDF文檔,網頁)程序,你不確定哪些程序已經安裝。該功能使操作系統能夠根據文件類型從默認程序列表中爲您選擇。

雖然您也可以使用該功能打開可執行文件(例如控制檯程序),但是替代方案將使用QProcess。如果你不需要與控制檯程序通信或等待它完成,你可以用兩個QProcess::startDetached()靜態函數一個剛剛啓動它在發射後不管的方式

QProcess::startDetached

+0

控制檯窗口仍然顯示。 – mrg95

相關問題