2011-06-04 62 views
1

注意:類mywindow的(QWidget中):Pyside QProcess中需要幫助

初始化

self.proc = QtCore.QProcess(self) 
self.te = QTextEdit(self) 
self.btn = QPushButton("Execute", self) 
self.btn.clicked.connect(self.__event_btn) 

現在我有這樣的:

def __event_btn(self): 
    w_dir = "" # This set to my working directory where my C files are 
    args = ["-o", "MyFile", "MyFile.c"] 
    cmd = "gcc" 

    self.proc.setWorkingDirectory(dir) 
    self.proc.readyReadStandardOutput.connect(self.__read) 
    self.proc.closeWriteChannel() 
    self.proc.setReadChannel(QtCore.QProcess.StanfardOutput()) 
    self.proc.start(cmd, args) 

def __read(self): 
    self.te.setText(self.proc.readAllStandardOutput) 

上面的代碼不會顯示任何東西,直到執行過程完成。

現在我的問題是,有沒有什麼辦法可以捕獲gcc的輸出並通過不等待進程完成而在TextEdit中顯示它們? (該方式的cmd.exe或端子短做,他們顯示輸出作爲程序運行)

感謝

- 馬克

回答

3

你需要保證程序(gcc在這種情況下)以未緩衝的stdout運行。除非寫入控制檯(cmd.exe或終端),否則大多數控制檯應用程序都是緩衝區,因爲這會提高性能。據推測,Qt用於緩存QProcess'輸出的內部流不會被視爲ttys,這就是爲什麼你得到緩衝並只在最後看到輸出。

通常C程序可以關閉緩衝(setvbuf),但大多數不會這樣做。由於您需要與gcc配合使用,因此您必須使用類似unbuffer這樣的實用程序來緩衝非ttys。見this answer