2013-09-05 71 views
0

我試圖讓Qt在單擊按鈕時啓動另一個Qt程序。 這是我的代碼。在另一個程序中啓動程序

void Widget::launchModule(){ 
    QString program = "C:\A2Q1-build-desktop\debug\A2Q1.exe"; 
    QStringList arguments; 
    QProcess *myProcess = new QProcess(this); 
    myProcess->start(program, arguments); 
    myProcess->waitForFinished(); 
    QString strOut = myProcess->readAllStandardOutput(); 


} 

所以它應該保存到QString strOut。首先,我在QString程序中出現錯誤,我不明白如何將這個程序指向程序,因爲QProcess的所有示例都使用了/這對我來說沒有任何意義。此外與程序字符串的語法正確,這將工作? 感謝

+2

用途是'/'或''\\作爲目錄分隔符。 (是的,Windows允許使用'/'...) – Joni

回答

1
  1. 在C/C++字符串字面量,你必須逃避所有反斜槓。

  2. 在Qt中使用waitForX()函數真的很糟糕。它們會阻止您的GUI並使您的應用程序無響應。從用戶體驗的角度來看,它真的很糟糕。不要這樣做。

您應該使用信號和插槽進行異步編碼。

我的other answer提供了一個非常完整的例子,說明異步過程通信如何工作。它使用QProcess自行啓動。

您的原始代碼可以作如下修改:

class Window : ... { 
    Q_OBJECT 
    Q_SLOT void launch() { 
     const QString program = "C:\\A2Q1-build-desktop\\debug\\A2Q1.exe"; 
     QProcess *process = new QProcess(this); 
     connect(process, SIGNAL(finished(int)), SLOT(finished())); 
     connect(process, SIGNAL(error(QProcess::ProcessError)), SLOT(finished())); 
     process->start(program); 
    } 
    Q_SLOT void finished() { 
     QScopedPointer<Process> process = qobject_cast<QProcess*>(sender()); 
     QString out = process->readAllStandardOutput(); 
     // The string will be empty if the process failed to start 
     ... /* process the process's output here */ 
     // The scoped pointer will delete the process at the end 
     // of the current scope - right here.  
    } 
    ... 
} 
相關問題