Очистить данные из виджета QTextEdit/QPlainTextEdit, а не добавлять новую строку под старой строкой
Есть виджет QTextEdit/QPlainTextEdit, в котором новые данные появляются каждый раз новой строкой.
Вопрос, как осуществить замену/стирание старых данных новой строкой/строками. Как бы получается заменяем старый блок данных новым блоком данных ! Исходный код взят из ранее заданного вопроса.
from PyQt5 import QtCore, QtGui, QtWidgets
from time import sleep
class MyThread(QtCore.QThread):
about_new_log = QtCore.pyqtSignal(str)
def run(self):
for i in range(1000):
text = str(i) + '\n'
# Посылаем сигнал
self.about_new_log.emit(text)
sleep(1)
class Ui_MainWindow(object):
def __init__(self):
self.flag = 1
def setupUi(self, MainWindow):
MainWindow.setObjectName("example")
MainWindow.resize(500, 500)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(120, 18, 200, 23))
self.pushButton.setObjectName("Получить данные")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(10, 10, 10, 10))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 240, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("example", "example"))
self.pushButton.setText(_translate("example", "Получить данные"))
self.pushButton.clicked.connect(self.my_func)
# Поле вывода текста
self.plainTextEdit = QtWidgets.QPlainTextEdit()
self.plainTextEdit.setObjectName("plainTextEdit")
self.plainTextEdit.setObjectName("centralwidget2")
self.plainTextEdit = QtWidgets.QPlainTextEdit(self.centralwidget)
self.plainTextEdit.setGeometry(QtCore.QRect(60, 160, 350, 250))
self.thread = MyThread()
# Подключаем сигнал потока к методу plainTextEdit
self.thread.about_new_log.connect(self.plainTextEdit.insertPlainText)
def my_func(self): # Функция имитирует получение динамических данных. Данных приходит много и с задержкой.
# Запускаем поток
self.thread.start()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
Ответы (2 шт):
void QPlainTextEdit::
setPlainText(const QString &text)Изменяет текст редактирования текста на текст строки. Любой предыдущий текст удаляется.
textинтерпретируется как обычный текст.
Больше https://doc.qt.io/qt-5/qplaintextedit.html#setPlainText
Не изменяйте код, сгенерированный Qt Designer. Создайте другой класс,
который наследуется от соответствующего виджета, и используйте созданный класс для его заполнения.
from PyQt5 import QtCore, QtGui, QtWidgets
#from time import sleep
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("example")
MainWindow.resize(500, 500)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(120, 18, 200, 23))
self.pushButton.setObjectName("Получить данные")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(10, 10, 10, 10))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 240, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("example", "example"))
self.pushButton.setText(_translate("example", "Получить данные"))
self.pushButton.clicked.connect(self.my_func)
class MyThread(QtCore.QThread):
about_new_log = QtCore.pyqtSignal(str)
def run(self):
for i in range(1000):
text = str(i) + '\n'
# Посылаем сигнал
self.about_new_log.emit(text)
self.msleep(1000) # !!!
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
# Поле вывода текста
self.plainTextEdit = QtWidgets.QPlainTextEdit()
self.plainTextEdit.setObjectName("plainTextEdit")
self.plainTextEdit = QtWidgets.QPlainTextEdit(self.centralwidget)
layout = QtWidgets.QGridLayout(self.centralwidget)
layout.setContentsMargins(0, 0, 0, 0)
layout.addWidget(self.plainTextEdit)
layout.addWidget(self.pushButton)
self.thread = MyThread()
# Подключаем сигнал потока к методу plainTextEdit
# self.thread.about_new_log.connect(self.plainTextEdit.insertPlainText)
self.thread.about_new_log.connect(self.plainTextEdit.setPlainText) # +++
def my_func(self):
# Запускаем поток
self.thread.start()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
app.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
w = MainWindow()
w.show()
sys.exit(app.exec_())
Если нужно просто очистить все текстовое поле, то проще использовать .clear(). Применяется также и к др. похожим виджетам.
А если нужно заменить весь текст, то проще сразу задать .setPlainText() (без предварительной очистки). Добавляется к соответствующему виджету.
text=QPlainTextEdit()
text.clear()
#Или замена:
text.setPlainText('текст')
