(pyqt5)在用信号和槽进行多窗口交互时遇到的问题

完整正确的代码如下

主要功能是在主窗口中通过工具栏打开一个子窗口,在子窗口中有一文本编辑框,当其中的值改变时会触发反馈信号,从而引起主窗口的应激变化


from PyQt5.QtWidgets import *
# 这个为子窗口的文件名
import gjlabelwin
import sys


# 创建一个桌面工具类,上面只有一个工具栏
class DesktopTools(QMainWindow):
    def __init__(self):
        # 初始化
        super().__init__()
        self.setWindowTitle('desktop toolbar')
        self.resize(300, 300)
        self.UI()

    def UI(self):
        # 创建工具栏对象作为主要表现形式
        self.mainBar = QToolBar('desktop', self)

        # 添加功能选项,弹出备忘录输入窗口
        self.action1 = QAction("label", self.mainBar)
        self.action1.triggered.connect(self.remember)
        self.mainBar.addAction(self.action1)
        self.addToolBar(self.mainBar)

    def remember(self):
        # 创建并弹出子窗口,并将其中的反馈信号在此和槽函数链接
        windows1 = gjlabelwin.labelwindow(self)
        windows1.textchangesignal.connect(self.ttchange)
        windows1.show()

    def ttchange(self, f):
        print('4')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    toolbar = DesktopTools()
    toolbar.show()
    sys.exit(app.exec_())


# 子窗口文件代码

from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtGui
import sys


class labelwindow(QMainWindow):
    # 创建一个信号
    textchangesignal = QtCore.pyqtSignal(str)

    def __init__(self,parent=None):
        super(labelwindow, self).__init__(parent)
    # 生成一个文档输入区域,并实现随时保存,而且在关掉之后内容不丢失,再次打开时自动填充文档
        self.maintext = QTextEdit('the road')
        self.resize(300, 300)
    # 将文本文件中的数据导入到多行文本编辑框中
        self.url1 = './挂件数据/备忘录.txt'
        with open(self.url1, 'r') as f:
            self.text = f.read()
        self.maintext.setText(self.text)
    # 当编辑框内容改变时触发响应信号
        self.maintext.textChanged.connect(self.savetx)

    # 使文本编辑框作为中心栏
        self.setCentralWidget(self.maintext)

    def closeEvent(self, f):
        pass
    # 定义事件,当文本编辑栏发生改变时反馈信号
    def savetx(self):
        self.textchangesignal.emit('1')


之前遇到的错误:

1.子窗口中的类在初始化时没有加上父类参数

错误的例子
class labelwindow(QMainWindow):
    closesignal = QtCore.pyqtSignal(str)
    textchangesignal = QtCore.pyqtSignal(str)
    
    def __init__(self):      #  此处应该改为def __init__(self,parent=None):
        super(labelwindow, self).__init__()    #  这里改为.init(parent)

原因:在主窗口创建子窗口时的代码是

windows1 = gjlabelwin.labelwindow(self)

这里相当于传入了一个父参数self,而在子窗口的声明中应该为这个参数留个位置

2.在子窗口中定义关闭事件函数closeEvent()时,函数的参数只设置了self。然而这里因为我两个窗口的类继承的都是QMainWindow,只设置一个self参数时,当只是关闭子窗口时,closeEvent会被传入两个信号,这时两个窗口都会被关闭,而且在debug的时候也会显示错误信息。

而当设置两个参数时就正常了

# 这是错误的,应该是def closeEvent(self, f)
def closeEvent(self):
    pass

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值