2016-07-29 50 views
0

我無法通過單擊按鈕將一行文本從窗口中的一個LineEdit傳遞到另一個窗口中的lineEdit時出現問題。我已經閱讀了多個示例,但似乎無法讓信號在第二個窗口上顯示。這是我正在創建的應用程序的一個非常配對的版本。我希望你們都能看到我不能做的事情。第二個窗口將在第一個窗口中的按鈕被點擊時打開,但沒有任何反應。在使用PyQt連接Qt中的兩個窗口時使用插槽和信號時遇到的問題

感謝

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類,並在send_signal定義中的發射信號之前移動了 self.Window2 = Window2() 但仍然沒有運氣。 –

回答

0

好吧,所以有你可以做到這一點的幾種方法。你在信號插槽的正確軌道上。但是,由於每個班級都有多次打電話給其他班級,因此事情會有些混亂。

一個爲您解決問題的方法是簡單地改變__init__功能爲您Window2類,以便它接受文本,並將QLineEdit文本輸入的文本。這將會工作一次。當你點擊按鈕時,第二個窗口將顯示,並且隨後的點擊不會改變文本。請看下面是否您希望按鈕始終更新其他窗口中的文本。

一次點擊

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發送信號按鈕,你會得到Window2與第一窗口的QLineEdit的在第二個窗口中的一個相對應的內容。

如果你想這兩個窗口進行鏈接,這樣,當您按下該按鈕時,第二個窗口的QLineEdit將再次在Window1改變當前的文本,你可以在你send_signal方法添加一個簡單的if else語句中的第一個類。您還需要將實際的Window1類傳遞到Window2

如果是第一次按下按鈕,請使用當前文本實例化Window2類。如果是第二次+按下按鈕,則可以從第一級發出信號並更改第二級中的文本。下面是一些代碼,以這種方式工作:

鏈接窗口

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

如果您有任何疑問,請發表評論!我很快就寫了這篇文章。當我有更多的時間時,我會編輯更多的解釋!