2016-07-29 25 views
0

Ich habe Probleme beim Übergeben einer Textzeile von einem LineEdit in einem Fenster zu einem lineEdit in einem anderen Fenster durch Klicken auf eine Schaltfläche. Ich habe mehrere Beispiele gelesen, aber ich kann nicht scheinen, das Signal auf dem zweiten Fenster anzuzeigen. Dies ist eine sehr gepaarte Version der App, die ich erstelle. Ich hoffe, ihr könnt etwas sehen, was ich nicht sehen kann. Das zweite Fenster wird geöffnet, wenn auf die Schaltfläche im ersten Fenster geklickt wird, aber nichts passiert.Probleme mit Steckplätzen und Signalen beim Verbinden von zwei Fenstern in Qt mit PyQt

Dank

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() 
     self.Window2.show() 

class Window2(QtGui.QMainWindow): 
    def __init__(self): 
     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(None, self) 
     self.line_response.move(120,100) 

     self.__main=Window1() 
     self.__main.textSaved.connect(self.showMessage) 

    @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() 
+0

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

+0

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. –

Antwort

0

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!