Elenka
Elenka

Reputation: 3

How to exchange data between two forms using pyqt5?

I'd like to enter some text to one window, then see it at another window, using pyqtSignal, but, unfortunately, it does not work. I'm not sure whether I do everything right to exchange data between two forms. Here is my attempt:

import sys
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
from PyQt5.QtWidgets import QMainWindow, QTextBrowser, QPlainTextEdit


class FirstForm(QMainWindow):
    Signal_OneParameter = pyqtSignal(str)

    def __init__(self):
        super().__init__()
        self.initUI()

    def buildDependenciesChanged(self):
        self.a = self.textboxValue.toPlainText()
        return self.a

    def initUI(self):
        self.setGeometry(300, 300, 500, 500)
        self.setWindowTitle('Html editor')
        self.textboxValue = QPlainTextEdit(self)
        self.a = self.textboxValue.textChanged.connect(self.buildDependenciesChanged)

        self.btn = QPushButton('Ok', self)
        self.btn.move(100, 100)
        self.btn.resize(self.btn.sizeHint())

        self.btn.clicked.connect(self.open_second_form)

    def open_second_form(self):
        date_str = self.a
        self.Signal_OneParameter.emit(date_str)
        self.second_form = SecondForm(self)
        self.second_form.show()

class SecondForm(QWidget):
    def __init__(self, *args):
        super().__init__()
        self.initUI(args)

    def initUI(self, args):
        self.setGeometry(300, 300, 500, 500)
        self.setWindowTitle('Second Form')

        self.Signal_OneParameter.connect(self.deal_emit_slot)

    def deal_emit_slot(self, dateStr):
        self.label = QTextBrowser(self)
        self.label.setHtml(dateStr)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    form = FirstForm()
    form.show()
    sys.exit(app.exec())

Upvotes: 0

Views: 110

Answers (1)

eyllanesc
eyllanesc

Reputation: 244132

It seems that the OP does not understand correctly the logic of signals and slots. The signals send the information to the slots that are connected, and every time you want to send information then the signal must be emitted.

import sys
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import (
    QApplication,
    QMainWindow,
    QPlainTextEdit,
    QPushButton,
    QTextBrowser,
    QVBoxLayout,
    QWidget,
)


class FirstForm(QMainWindow):
    Signal_OneParameter = pyqtSignal(str)

    def __init__(self, parent=None):
        super().__init__(parent)
        self.initUI()

    def buildDependenciesChanged(self):
        self.Signal_OneParameter.emit(self.textboxValue.toPlainText())

    def initUI(self):
        self.setGeometry(300, 300, 500, 500)
        self.setWindowTitle("Html editor")
        self.textboxValue = QPlainTextEdit(self)
        self.textboxValue.textChanged.connect(self.buildDependenciesChanged)

        self.btn = QPushButton("Ok", self)
        self.btn.move(100, 100)
        self.btn.resize(self.btn.sizeHint())

        self.btn.clicked.connect(self.open_second_form)

    def open_second_form(self):
        self.second_form = SecondForm()
        self.Signal_OneParameter.connect(self.second_form.deal_emit_slot)
        self.second_form.show()


class SecondForm(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 500, 500)
        self.setWindowTitle("Second Form")
        lay = QVBoxLayout(self)
        self.label = QTextBrowser()
        lay.addWidget(self.label)

    def deal_emit_slot(self, dateStr):
        self.label.setHtml(dateStr)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = FirstForm()
    form.show()
    sys.exit(app.exec())

Upvotes: 1

Related Questions