在使用PyQt连接Qt中的两个窗口时使用插槽和信号时遇到的问题

问题描述:

我无法通过单击按钮将一行文本从窗口中的一个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() 但仍然没有运气。 –

好吧,所以有你可以做到这一点的几种方法。你在信号插槽的正确轨道上。但是,由于每个班级都有多次打电话给其他班级,因此事情会有些混乱。

一个为您解决问题的方法是简单地改变__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() 

如果您有任何疑问,请发表评论!我很快就写了这篇文章。当我有更多的时间时,我会编辑更多的解释!