pyQt:如何在windows之间传递信息

时间:2016-04-21 14:39:55

标签: pyqt

我有两个窗口,都包含一个按钮和一个lineEdit。我想在两个窗口之间创建一个“乒乓”通信。首先,我在第一个窗口的lineEdit中写一些东西,按下按钮,然后出现第二个窗口。

我希望第一个窗口的lineEdit中写入的消息出现在第二个窗口的lineEdit中。 (反之亦然)。

这是用于创建First窗口的代码,该窗口派生自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))

这是用于创建第二个窗口的代码,该窗口派生自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))

这是主要代码:

# -*- 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()    

我收到此消息:

'First' object has no attribute 'lineEditSecond'

这是非常合乎逻辑的,因为pass_text()是First类的函数。无论如何,我想不出任何解决方法。

任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

你几乎让它发挥作用。当我得到一个attribute error并且无法解决问题时,我使用print type(object)print dir(object)作为第一行调试来仔细检查对象是否是我认为的对象是,并检查其所有属性。

问题是您没有传递要设置其文本的第二个对话框。我修复了此问题,并对您的First课程进行了一些其他小修改:

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()

我已经收紧了它,以便更加封装,更容易调试/思考/发布。