在使用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()
好吧,所以有你可以做到这一点的几种方法。你在信号插槽的正确轨道上。但是,由于每个班级都有多次打电话给其他班级,因此事情会有些混乱。
一个为您解决问题的方法是简单地改变__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()
如果您有任何疑问,请发表评论!我很快就写了这篇文章。当我有更多的时间时,我会编辑更多的解释!
'Window2'只有在'textSaved'信号已经发出后才创建。因此,在发射时,没有听众,信号被忽略。 – arhzu
我在Window1类之前移动了Window2类,并在send_signal定义中的发射信号之前移动了 self.Window2 = Window2() 但仍然没有运气。 –