user3060854
user3060854

Reputation: 933

pyQt: how to pass information between windows

I have two windows, both containing one button and one lineEdit. I want to create a "ping - pong" communication between both windows. At first, I write something in the lineEdit of the first window, press the button, and a second window appears.

I want the message written in the lineEdit of the first window to appear to the lineEdit of the second window. (and vice versa).

this is the code for the creation of the First window, derived from Qt Designer:

# -*- coding: utf-8 -*-

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(331, 249)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.PushButtonFirst = QtGui.QPushButton(self.centralwidget)
        self.PushButtonFirst.setGeometry(QtCore.QRect(140, 180, 131, 27))
        self.PushButtonFirst.setObjectName(_fromUtf8("PushButtonFirst"))
        self.lineEditFirst = QtGui.QLineEdit(self.centralwidget)
        self.lineEditFirst.setGeometry(QtCore.QRect(130, 50, 113, 27))
        self.lineEditFirst.setObjectName(_fromUtf8("lineEditFirst"))
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)
        self.actionNew = QtGui.QAction(MainWindow)
        self.actionNew.setObjectName(_fromUtf8("actionNew"))
        self.actionOpen = QtGui.QAction(MainWindow)
        self.actionOpen.setObjectName(_fromUtf8("actionOpen"))
        self.actionClose = QtGui.QAction(MainWindow)
        self.actionClose.setObjectName(_fromUtf8("actionClose"))

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.PushButtonFirst.setText(_translate("MainWindow", "PushButtonFirst", None))
        self.actionNew.setText(_translate("MainWindow", "New", None))
        self.actionOpen.setText(_translate("MainWindow", "Open", None))
        self.actionClose.setText(_translate("MainWindow", "Close", None))

this is the code for the creation of the Second window, derived from Qt Designer:

# -*- coding: utf-8 -*-

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(329, 260)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.PushButtonSecond = QtGui.QPushButton(self.centralwidget)
        self.PushButtonSecond.setGeometry(QtCore.QRect(130, 190, 121, 27))
        self.PushButtonSecond.setObjectName(_fromUtf8("PushButtonSecond"))
        self.lineEditSecond = QtGui.QLineEdit(self.centralwidget)
        self.lineEditSecond.setGeometry(QtCore.QRect(120, 80, 113, 27))
        self.lineEditSecond.setObjectName(_fromUtf8("lineEditSecond"))
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.PushButtonSecond.setText(_translate("MainWindow", "PushButtonSecond", None))

and this is the main code:

# -*- coding: utf-8 -*-

from PyQt4 import QtGui, QtCore
import sys
import design1, design2

class Second(QtGui.QMainWindow, design2.Ui_MainWindow):
    def __init__(self, parent=None):
        super(Second, self).__init__(parent)
        self.setupUi(self)

class First(QtGui.QMainWindow, design1.Ui_MainWindow):
    def __init__(self, parent=None):
        super(First, self).__init__(parent)
        self.setupUi(self)

        self.PushButtonFirst.clicked.connect(self.on_PushButtonFirst_clicked)
        self.dialog = Second(self)

    def on_PushButtonFirst_clicked(self):
        self.my_text_First = self.lineEditFirst.text()
        pass_text(self)
        self.dialog.show()

def pass_text(obj):
    obj.lineEditSecond.setText('OK')

def main():
    app = QtGui.QApplication(sys.argv)
    main = First()
    main.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()    

I receive this message:

'First' object has no attribute 'lineEditSecond'

which is quite logical, since pass_text() is a function of the First class. Anyway, I can't think any workaround.

Any thought would be appreciated.

Upvotes: 3

Views: 7556

Answers (1)

eric
eric

Reputation: 8029

You pretty much got it working. When I get an attribute error and can't figure it out, I use print type(object) and print dir(object) as a first-line of debugging to double check that the object is what I think it is, and to inspect all of its attributes.

The problem is you were not passing the second dialog whose text you wanted to set. I fixed this, and made a few other minor changes to your First class:

class First(QtGui.QMainWindow, design1.Ui_MainWindow):
    def __init__(self, parent=None):
        super(First, self).__init__(parent)
        self.setupUi(self)
        self.PushButtonFirst.clicked.connect(self.on_PushButtonFirst_clicked)
        self.partnerDialog = Second(self)

    def on_PushButtonFirst_clicked(self):
        self.partnerDialog.lineEditSecond.setText(self.lineEditFirst.text())
        self.partnerDialog.show()

class Second(QtGui.QMainWindow, design2.Ui_MainWindow):
    def __init__(self, parent=None):
        super(Second, self).__init__(parent)
        self.setupUi(self)
        self.PushButtonSecond.clicked.connect(self.on_PushButtonSecond_clicked)
        self.partnerDialog = parent  #otherwise, recursion

    def on_PushButtonSecond_clicked(self):
        self.partnerDialog.lineEditFirst.setText(self.lineEditSecond.text())
        self.partnerDialog.show()

I have tightened it up to keep things more encapsulated and easier for debugging/thinking/posting here.

Upvotes: 2

Related Questions