Вывод текста на форму с потока с помощью сигналов
Нужна помощь в следующей задаче:
Есть главное окно MainWindow и есть отдельный класс потока в котором есть текст. Подскажите как с помощью сигналов на форму plainTextEdit которая находится на главной форме вывести текст через сигналы?
Код главного окна :
import sys
from PySide6.QtWidgets import *
from Controller.Potok_Controller import Potok_Controller
from View.ui_potok import Ui_MainWindow
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.pushButton.clicked.connect(self.open_window)
def open_window(self):
self.myThread = Potok_Controller()
# self.myThread.mysignal.connect(self.sendText)
self.myThread.start()
if __name__ == '__main__':
app = QApplication()
window = MainWindow()
window.show()
sys.exit(app.exec())
UI код главного окна:
# -*- coding: utf-8 -*-
################################################################################
## Form generated from reading UI file 'untitledkonQbZ.ui'
##
## Created by: Qt User Interface Compiler version 6.3.1
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
QMetaObject, QObject, QPoint, QRect,
QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
QFont, QFontDatabase, QGradient, QIcon,
QImage, QKeySequence, QLinearGradient, QPainter,
QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QApplication, QFrame, QMainWindow, QPlainTextEdit,
QPushButton, QSizePolicy, QVBoxLayout, QWidget)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.verticalLayout = QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName(u"verticalLayout")
self.frame = QFrame(self.centralwidget)
self.frame.setObjectName(u"frame")
self.frame.setFrameShape(QFrame.StyledPanel)
self.frame.setFrameShadow(QFrame.Raised)
self.verticalLayout_2 = QVBoxLayout(self.frame)
self.verticalLayout_2.setObjectName(u"verticalLayout_2")
self.plainTextEdit = QPlainTextEdit(self.frame)
self.plainTextEdit.setObjectName(u"plainTextEdit")
self.verticalLayout_2.addWidget(self.plainTextEdit)
self.verticalLayout.addWidget(self.frame)
self.frame_2 = QFrame(self.centralwidget)
self.frame_2.setObjectName(u"frame_2")
self.frame_2.setFrameShape(QFrame.StyledPanel)
self.frame_2.setFrameShadow(QFrame.Raised)
self.verticalLayout_3 = QVBoxLayout(self.frame_2)
self.verticalLayout_3.setObjectName(u"verticalLayout_3")
self.pushButton = QPushButton(self.frame_2)
self.pushButton.setObjectName(u"pushButton")
self.verticalLayout_3.addWidget(self.pushButton)
self.verticalLayout.addWidget(self.frame_2)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QMetaObject.connectSlotsByName(MainWindow)
# setupUi
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
self.pushButton.setText(QCoreApplication.translate("MainWindow", u"\u0421\u0442\u0430\u0440\u0442 \u043f\u043e\u0442\u043e\u043a\u0430", None))
# retranslateUi
Код потокового класса:
import time
from PySide6.QtCore import QThread
class Potok_Controller(QThread):
def __init__(self, parent=None):
super(Potok_Controller, self).__init__(parent)
def txt(self):
txt1 = 'test1'
time.sleep(1)
txt2 = 'test2'
time.sleep(1)
txt3 = 'test3'
def run(self):
self.txt()
Ответы (1 шт):
Автор решения: Alexander Chernin
→ Ссылка
from PySide6.QtCore import Signal
class Potok_Controller(QThread):
mysignal = Signal(str)
def __init__(self, parent=None):
super(Potok_Controller, self).__init__(parent)
def txt(self):
self.mysignal.emit('test1')
time.sleep(1)
self.mysignal.emit('test2')
time.sleep(1)
self.mysignal.emit('test3')
def run(self):
self.txt()
Теперь в окне
def open_window(self):
self.myThread = Potok_Controller()
self.myThread.mysignal.connect(lambda text: self.plainTextEdit.setPlainText(text))
self.myThread.start()