我有一个主窗口包装类(比如 A)和包装中使用的另一个类(比如 B)。B 有一个方法,该方法反过来有一个 subprocess.check_call(command) 调用。我将其更改为使用 QProcess,以便能够与此进程通信并在主窗口 QTextEdit 中显示 Qprocess stdout 和 stderr,并将数据从主窗口 QLineEdit 发送回 Qprocess stdin。
为此我有:
class A(....):
def __init__(self):
....
QtCore.QObject.connect(self.ui.actionNew, QtCore.SIGNAL("triggered()", self.selectedNew)
self.qprocess = QtCore.QProcess()
self.connect(self.qprocess, QtCore.SIGNAL("readyReadStandardOutput()", self.readStdOut)
self.connect(self.qprocess, QtCore.SIGNAL("readyReadStandardError()", self.readStdErr)
def readStdOut(self):
self.ui.text_edit.append(QtCore.QString(self.qprocess.readAllStandardOutput()))
def readStdErr(self):
self.ui.text_edit.append(QtCore.QString(self.qprocess.readAllStandardError()))
def selectedNew(self:)
...
newB = B(self.qprocess)
newB.doWork(params)
class B():
def __init__(self, qprocess):
self.qp = qprocess
def doWork(params):
...
# creating a thread to not block the main thread
class ConsoleThread(threading.Thread):
def __init__(self, qprocess):
self.tqp = qprocess
threading.Thread.__init__(self)
def run(self):
self.qtp.execute("script_that_waits_for_user_input_during_execution")
# starting the thread and passing it the QProcess instance from B
ConsoleThread(self.qp).start()
print(self.qp.state()) # this returns 0, when I expected 2, obviously something wrong
最后,“script_that_waits_for_user_input_during_execution”的输出没有显示在 QTextEdit 中,但仍打印在控制台中。似乎我在 A 中没有收到任何信号,而且我没有达到 A.readStdOut() 方法。一般的想法是让一个 GUI 应用程序包装不同的命令行脚本。所以我需要一种方法来正确地从 QProcess 获取输出,并能够通过从 GUI 写入它来进行通信。当然,如果我将函数从 B 移动到 A(将消除不必要的步骤),它可能会不那么复杂,但同时 GUI 包装器应该与我认为的逻辑分开。
谢谢!