gpt4 book ai didi

python - 如何清除QTextEdit的文本并立即插入新文本

转载 作者:行者123 更新时间:2023-12-01 07:23:11 27 4
gpt4 key购买 nike

我正在构建一个 GUI,作为 Python 的交互式“曲线拟合工具”。我以 QTextEdit 小部件(只读模式)的形式添加了一个“日志记录”窗口,该窗口显示代码的相关输出 - 例如优化参数、警告等。这是通过重定向 sys.stdout 和 sys.stderr 来完成的通过这样的方式到 QTextEdit 小部件:

class Stream(QtCore.QObject):
newText = QtCore.pyqtSignal(str)

def write(self, text):
self.newText.emit(str(text))

class MyApp(QtWidgets.QMainWindow):
def __init__(self):
# Other stuff here...
self.outputWidget = QtWidgets.QTextEdit();
self.outputWidget.setReadOnly(True)
vLayout.addWidget(self.outputWidget)

sys.stderr = Stream(newText=self.onUpdateText)
sys.stdout = Stream(newText=self.onUpdateText)

我想要做的是,在用户完成某些操作(例如更改拟合函数等)后,清除日志记录窗口,然后继续打印出现的任何内容,以防止以前的拟合造成混淆。

最明显的事情是这样的:

def onUpdateText(self, text):
self.outputWidget.clear()
self.outputWidget.moveCursor(QtGui.QTextCursor.End,QtGui.QTextCursor.MoveAnchor)
self.outputWidget.insertPlainText(text)
self.outputWidget.ensureCursorVisible()

但是,这只会导致小部件中的所有文本被清除,并且不会显示任何其他内容(或者,更确切地说,根本不会显示任何内容)。删除 clear() 调用可以使其正常工作,但不会清除以前的输出。

在放入其他文本之前立即清除小部件文本的正确方法是什么?

编辑:

这是一个可重现的示例:

import sys

from PyQt5 import QtGui, QtCore,QtWidgets
from PyQt5.QtCore import pyqtSlot
import PyQt5.QtCore as qtcore

class Stream(QtCore.QObject):
newText = QtCore.pyqtSignal(str)

def write(self, text):
self.newText.emit(str(text))


class ApplicationWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self._main = QtWidgets.QWidget()
self.setCentralWidget(self._main)

vLayout = QtWidgets.QVBoxLayout(self._main);
self.inputWidget = QtWidgets.QLineEdit();
self.inputWidget.setText("Type something here.")
self.inputWidget.textEdited.connect(self.textChanged)
vLayout.addWidget(self.inputWidget)

self.outputWidget = QtWidgets.QTextEdit();
self.outputWidget.setReadOnly(True)
vLayout.addWidget(self.outputWidget)

sys.stdout = Stream(newText=self.onUpdateText)

def __del__(self):
sys.stdout = sys.__stdout__

def onUpdateText(self, text):
self.outputWidget.clear()
self.outputWidget.insertPlainText(text)
self.outputWidget.ensureCursorVisible()

def textChanged(self,newstr):
print(newstr)

if __name__ == "__main__":
qapp = QtWidgets.QApplication(sys.argv)
app = ApplicationWindow()
app.show()
qapp.exec_()

最佳答案

导致该问题的原因是 print() 方法在缓冲区中写入了 2 个文本:传递给 print 的文本和结束行(“\n”),您可以验证是否传递字节。这样,第一次写入就删除了之前的内容,并添加到了新的文本中,而第二次写入时,就删除了之前的文本,并导致了不可见的“\n”,造成了明显的不写入。

def onUpdateText(self, text):
self.outputWidget.insertPlainText(str(text.encode()))

输出:

enter image description here

因此,根据您的实际应用程序,有多种解决方案:

  • 使用 sys.stdout.write() 而不是 print()
def onUpdateText(self, text):
self.outputWidget.clear()
self.outputWidget.insertPlainText(text)

def textChanged(self, newstr):
sys.stdout.write(newstr)
  • 如果文本是尾行,请勿清理或执行任何操作:
def onUpdateText(self, text):
if text != "\n":
self.outputWidget.clear()
self.outputWidget.insertPlainText(text)

def textChanged(self, newstr):
print(newstr)

或者

def onUpdateText(self, text):
if text != "\n":
self.outputWidget.clear()
self.outputWidget.insertPlainText(text)

def textChanged(self, newstr):
print(newstr)

关于python - 如何清除QTextEdit的文本并立即插入新文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57584560/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com