2016-07-29 8 views
0

ボタンをクリックすると、ウィンドウのLineEditから別のウィンドウのライン編集にテキストの行を渡す際に問題があります。私は複数の例を読んだが、第2のウィンドウに表示する信号を得ることができない。これは私が作成しているアプリの非常に対になったバージョンです。私はあなたが私ができない何かを見ることができることを願っています。最初のウィンドウのボタンをクリックすると2番目のウィンドウが開きますが、何も起こりません。PyQtを使用してQtで2つのウィンドウを接続する際にスロットと信号を使用する際の問題

おかげ

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

'Window2'は、' textSaved'シグナルが既に出力された後にのみ作成されます。したがって、放出時にはリスナーはなく、信号は無視されます。 – arhzu

+0

Window1クラスの前にWindow2クラスを移動し、移動しました。 self.Window2 = Window2() send_signal定義のemit信号の前にはまだ運がありません。 –

答えて

0

よしので、あなたがこれを行うことができますいくつかの方法があります。あなたはシグナルスロットの事のために正しい道を歩いています。しかし、あなたは各クラスで複数の呼び出しを他のクラスに持っているので、少し混乱します。

Window2クラスの__init__機能を変更して、テキストを受け入れるようにして、入力したテキストにQLineEditというテキストを設定するだけです。これは一度動作します。ボタンをクリックすると、2番目のウィンドウが表示され、その後のクリックではテキストは変更されません。ボタンが常に他のウィンドウのテキストを更新するようにする場合は、以下を参照してください。

ワンタイムクリック

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

私はまた、あなたがそれを更新するか、self.bigboxが何であるかを知らないのですか?私はそれを実行しようとしたとき、私はself.line_responseに変更した、それはあなたが意味すると思ったからです。

このソリューションは、Window1の信号送信ボタンをクリックすると、第1のウィンドウのQLineEditの内容が第2のウィンドウの対応するウィンドウのWindow2になるという意味で機能します。

あなたがそのボタンを押したときに、第二のウィンドウのQLineEditWindow1に現在のテキストに再び変更されることを、あなたはあなたの最初の内側にあなたのsend_signal方法でelse文の場合、単純なを追加することができますように、これら二つのウィンドウをリンクさせたい場合クラス。また、実際のWindow1クラスをWindow2に渡す必要があります。

初めてボタンを押す場合は、Window2クラスを現在のテキストでインスタンス化します。 2回目の+ボタンを押すと、クラス1から信号を出し、2番目のクラスのテキストを変更することができます。ここでは、このように動作し、いくつかのコードは次のとおりです。

リンクの窓ご質問があれば、コメントしてください

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

!私はこれをすぐに書きました。私はもっ​​と時間があるときに、より多くの説明で編集します!

関連する問題