1

:クラスMyWindow(QWidget):

初期化

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からの出力をキャプチャして、テキストエディットに表示する方法はありますか?(cmd.exeまたはteminalの方法。プログラムの実行時に出力が表示されます)

ありがとう

- マーク

4

1 に答える 1

3

プログラム(gccこの場合)がバッファリングされていないstdoutで実行されていることを確認する必要があります。ほとんどのコンソールアプリケーションは、コンソール(cmd.exeまたは端末)に書き込む場合を除いてバッファリングします。これにより、パフォーマンスが向上します。おそらく、QtがQProcess出力をバッファリングするために使用する内部ストリームはttyとして表示されないため、バッファリングを取得し、最後に出力のみを表示します。

通常、Cプログラムはバッファリングをオフにするように作成できますが(setvbuf)、ほとんどの場合これは行いません。を操作する必要があるためgcc、これはおそらく非ttyをバッファリングするため、のようなユーティリティを使用する必要がありますunbufferこの回答を参照してください。

于 2011-06-06T18:24:03.220 に答える