使用信号和插槽将值传入和传出PYQT5窗口

问题描述

我有一个pyqt5应用程序,该应用程序允许创建窗口对象的实例。每个窗口都有一个qlineedit和两个标签。目的是使用在qline编辑中键入的文本填充标签。如果在类中使用连接到函数的连接,则这很简单。

def onChanged(self,text):
    self.lable1.setText(text)

但是对于label2,我想将在qline编辑框中输入的文本传输到外部python函数,然后让该函数将文本回显到发送它的窗口中的label2。

我可以使用信号和插槽将文本从gui中提取出来,并导入到称为updater的函数中。我已经设法从“自我”中识别出对象的来源(父母),但无法弄清楚如何使用它来将文本映射到正确的标签实例。如果我知道实例,则很容易填充标签,但是在动态创建和销毁窗口时会遇到困难。感谢收到任何建议。

下面列出:

import sys
from PyQt5.QtWidgets import (QLabel,QLineEdit,QVBoxLayout)

from PyQt5.QtCore import QObject,pyqtSignal,pyqtSlot
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication

class Window(QtWidgets.QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        hBox = QVBoxLayout(self)

        self.lable1 = QLabel(self)
        self.lable2 = QLabel(self)

        qle1 = QLineEdit(self)
        #qle2 = QLineEdit(self)

        qle1.textChanged[str].connect(self.onChanged)
        #qle2.textChanged[str].connect(self.onChanged)

        hBox.addWidget(qle1)
        #hBox.addWidget(qle2)
        hBox.addWidget(self.lable1)
        hBox.addWidget(self.lable2)

        self.resize(250,200)
        self.setwindowTitle('QLineEdit')
        self.show()

    def onChanged(self,text):
        self.lable1.setText(text)
        #self.lable2.setText(text)
        print("Parent of onChanged = ",self)
        parent = str(self)
        sentBy = str(self.sender())
        updater1.updateSignal.emit(text,parent)

    def onChangedExternal(self,text):
        print("Parent of onChangedExternal = ",self)
        self.lable2.setText(text)



# define a new slot that receives an update string and the
# "address" of the widget to which the updated string should be returned
@pyqtSlot(str,str)
def update_something(stuff,From):
    echo = f'{str(From)}.onChangedExternal({stuff})'
    print("Echo : ",echo)

    #wina.onChangedExternal(stuff)   #Need generalised way to call this function with winx!


class Updater(QObject):
    # create a new signal to handle strings
    updateSignal = pyqtSignal(str,str)

#instantiate Updater
updater1 = Updater()
# connect signal to slot
updater1.updateSignal.connect(update_something)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    wina = Window()
    winb = Window()
    print(wina,winb)
    sys.exit(app.exec_())

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)