Okay, so gibt es ein paar Möglichkeiten gibt, dies zu tun. Sie sind auf dem richtigen Weg für die Signal-Slot-Sache. Da Sie jedoch in jeder Klasse mehrere Aufrufe an die andere Klasse haben, werden die Dinge ein wenig durcheinander gebracht.
Ein Weg, um Ihr Problem zu lösen, ist einfach die __init__
Funktion für Ihre Klasse zu ändern, so dass es Text akzeptiert, und legt den QLineEdit
Text auf den eingegebenen Text. Dies wird einmal funktionieren. Wenn Sie auf die Schaltfläche klicken, wird das zweite Fenster angezeigt und nachfolgende Klicks ändern den Text nicht. Schauen Sie unten, wenn Sie möchten, dass die Schaltfläche den Text im anderen Fenster immer aktualisiert.
Einmal klicken
import sys
from PyQt4 import QtGui, QtCore
class Window1(QtGui.QMainWindow):
textSaved = QtCore.pyqtSignal(str)
def __init__(self):
super(Window1,self).__init__()
self.setGeometry(50,50,500,300)
self.setWindowTitle("PyQt Signal Signal Emitter")
self.home()
def home(self):
self.__line=QtGui.QLineEdit("howdy", self)
self.__line.move(120,100)
btn=QtGui.QPushButton("Send Signal", self)
btn.clicked.connect(self.send_signal)
btn.move(0,100)
self.show()
def send_signal(self):
signal=self.__line.displayText()
self.textSaved.emit(signal)
self.Window2=Window2(signal) # instantiate Window2 with the text
self.Window2.show()
class Window2(QtGui.QMainWindow):
def __init__(self, txt):
self.text = txt
super(Window2,self).__init__()
self.setGeometry(50,50,500,300)
self.setWindowTitle("PyQt Signal Slot Receiver")
self.home()
def home(self):
self.line_response=QtGui.QLineEdit(self.text, self)
self.line_response.move(120,100)
@QtCore.pyqtSlot()
def showMessage(self, message):
self.bigbox(self, "The message is:"+ message)
self.show()
def run():
app=QtGui.QApplication(sys.argv)
GUI=Window1()
sys.exit(app.exec_())
run()
Ich weiß auch nicht, was self.bigbox
ist, möchten Sie, dass aktualisieren? Als ich es versucht habe, habe ich es in self.line_response
geändert, weil ich dachte, dass du das meinst.
Diese Lösung wird im Sinne arbeiten, wenn Sie die Send Signal-Taste auf Window1
klicken Sie Window2
mit dem Inhalt des QLineEdit
des ersten Fensters in der entsprechenden im zweiten Fenster zu bekommen.
Wenn Sie wollen, dass diese beiden Fenster verknüpft werden, so dass, wenn Sie diese Taste drücken, ist das zweite Fenster QLineEdit
wieder in Window1
auf den aktuellen Text ändern, können Sie eine einfache, wenn else-Anweisung in Ihrem send_signal
Methode in Ihrem ersten hinzufügen Klasse. Sie müssen auch die tatsächliche Window1
Klasse in Window2
übergeben Wenn Sie zum ersten Mal auf die Schaltfläche drücken, instanziieren Sie die Klasse mit dem aktuellen Text. Wenn Sie zum zweiten Mal die Taste drücken, können Sie ein Signal aus der ersten Klasse ausgeben und den Text in der zweiten Klasse ändern. Hier einige Code, der auf diese Weise funktioniert:
verlinkte Fenster
import sys
from PyQt4 import QtGui, QtCore
class Window1(QtGui.QMainWindow):
textSaved = QtCore.pyqtSignal(str)
def __init__(self):
super(Window1,self).__init__()
self.setGeometry(50,50,500,300)
self.setWindowTitle("PyQt Signal Signal Emitter")
self.home()
self.counter = 0
def home(self):
self.__line=QtGui.QLineEdit("howdy", self)
self.__line.move(120,100)
btn=QtGui.QPushButton("Send Signal", self)
btn.clicked.connect(self.send_signal)
btn.move(0,100)
self.show()
def send_signal(self):
if self.counter == 0:
signal=self.__line.displayText()
self.Window2=Window2(signal, self)
self.Window2.show()
self.textSaved.connect(self.Window2.showMessage)
self.counter = 1
else:
signal = self.__line.displayText()
self.textSaved.emit(signal)
class Window2(QtGui.QDialog):
def __init__(self, txt, window1):
self.text = txt
self.signal1 = window1.textSaved
super(Window2,self).__init__()
self.setGeometry(50,50,500,300)
self.setWindowTitle("PyQt Signal Slot Receiver")
self.home()
self.signal1.connect(self.showMessage)
def home(self):
self.line_response=QtGui.QLineEdit(self.text, self)
self.line_response.move(120,100)
def showMessage(self, message):
self.line_response.setText(message)
def run():
app=QtGui.QApplication(sys.argv)
GUI=Window1()
sys.exit(app.exec_())
run()
Wenn Sie Fragen haben, können Sie einen Kommentar! Ich habe das schnell geschrieben; Ich werde mit mehr Erklärungen bearbeiten, wenn ich mehr Zeit habe!
Das 'Window2' wird erst erzeugt, nachdem das' textSaved' Signal bereits ausgegeben wurde. Somit gibt es zum Zeitpunkt des Emittierens keine Listener und das Signal wird ignoriert. – arhzu
Ich habe die Window2-Klasse vor der Window1-Klasse verschoben und self.Window2 = Window2() vor dem Emit-Signal in der Send_Signal-Definition verschoben, aber immer noch kein Glück. –