完整正确的代码如下
主要功能是在主窗口中通过工具栏打开一个子窗口,在子窗口中有一文本编辑框,当其中的值改变时会触发反馈信号,从而引起主窗口的应激变化
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