注意:类MyWindow(QWidget):
在 init
中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或teminal的方式。它们在程序运行时显示输出)
由于
- 标记
答案 0 :(得分:3)
您需要确保程序(在这种情况下为gcc
)运行stdout unbuffered。除非写入控制台(cmd.exe
或终端),否则大多数控制台应用程序都会缓冲,因为这会提高性能。据推测,Qt用来缓冲QProcess
'输出的内部流不被视为ttys,这就是为什么你得到缓冲并且最后才看到输出。
通常可以使C程序关闭缓冲(setvbuf
),但大多数都不这样做。由于您需要使用gcc
来处理非ttys的事件,因此您必须使用像unbuffer
这样的实用程序。请参阅this answer。