1.定义一个重定向信号类

1
2
3
4
5
6
7
8
9
# 重定向信号
class EmittingStr(QtCore.QObject):
textWritten = QtCore.pyqtSignal(str) # 定义一个发送str的信号

def write(self, text):
self.textWritten.emit(str(text))
loop = QEventLoop()
QTimer.singleShot(1000, loop.quit)
loop.exec_()

2.界面中加入方法

1
2
3
4
5
6
7
8
9
10
11
class Ui_MainWindow(QtWidgets.QWidget,...):

'''
#添加此方法
def outputWritten(self, text):
#self.textEdit.clear()
cursor = self.textEdit.textCursor()
cursor.movePosition(QtGui.QTextCursor.End)
cursor.insertText(text)
self.textEdit.setTextCursor(cursor)
self.textEdit.ensureCursorVisible()

3.界面初始化时连接重定向信号

1
2
3
4
5
6
7
8
class Ui_MainWindow(QtWidgets.QWidget,...):
def __init__(self, parent=None):
super(Ui_MainWindow, self).__init__(parent)
self.setupUi(self)
# 下面将输出重定向到textEdit中
sys.stdout = EmittingStr(textWritten=self.outputWritten)
sys.stderr = EmittingStr(textWritten=self.outputWritten)

使用此方法,控制台内容是同步显示到控件上的,如果多窗口调用,子窗口实例化后,所有控制台的内容都会定向到子窗口的控件上。(所以个人觉得单一窗口时直接用,多窗口就需要注意相应窗口实例化的时机😅)