问题由来:我们在进行开发的过程中,会遇见窗口跳转的功能,此时由于业务需要,可能需要将主窗口中的数据,与子窗口进行通信。
举例:开发了一个文本识别(也可以是YOLO系列,原理类似)训练的QT程序。此时,当我们可视化识别之后,如果发现我们的识别结果有误,则会将此图片以及预测结果保存,然后跳转到数据标注的窗口重新标注。那么,容易想到两个问题:
- 1.跳转到新的数据标注窗口之后,怎么获取识别错误图片的文件夹
- 2.跳转到新的数据标注窗口之后,怎么获取之前在识别窗口的文字预测结果,并直接在数据标注窗口进行修改。
def button_text_re_tag(self):
self.flag_reTag = True
# 断开原来的槽函数,改变原有的功能:
# 将此图片放进一个新的文件夹,然后重新产看标注信息
# 获取当前识别图片的路径
img_name = self.recog_list[self.index - 1]
print(img_name)
current_file_dir = os.path.dirname(img_name)
print(current_file_dir)
new_biaozhu_file_name = os.path.join(current_file_dir, "rebuilt_biaozhu")
if not os.path.exists(new_biaozhu_file_name):
os.makedirs(new_biaozhu_file_name)
# 将当前的图片放在新的文件,同时,进行下一页的操作;
# 当前的索引是self.index - 1
# 还要删除当前列表中索引对应的元素
shutil.move(self.recog_list[self.index - 1], new_biaozhu_file_name)
# print(self.recog_list)
# print(self.recog_list[0])
# print(self.recog_list[1])
# 注意pop的用法,是动态的
self.recog_list.pop(self.index - 1)
self.recog_list.pop(self.index - 1)
self.tagList.append(new_biaozhu_file_name)
self.tagList.append(self.flag_reTag)
self.tagList.append(self.recog_list[self.index])
self.tagList = list(OrderedDict.fromkeys(self.tagList))
self.show_img(self.index)
其中:tagList是一个用于存储两个窗口之间传递信息的列表,我们需要使用信号机制
def button_arrive_data_window(self):
from data_itemwindow import Ui_Form
self.data_item_window = Ui_Form()
self.data_item_window.show()
# 打开数据标注的页面,此时默认的打开现在加入到重新标注文件夹中的图片
self.signal_reTag_list.emit(self.tagList)
这里的signal_reTag_list需要在类中定义:
class Recog_MainWindow(QtWidgets.QMainWindow):
signal_reTag_list = QtCore.pyqtSignal(list)
def __init__(self, parent=None):
super(Recog_MainWindow, self).__init__(parent)
self.timer_video = QtCore.QTimer()
# 线程的定义需要放在这里,不能时局部变量.参考https://cloud.tencent.com/developer/article/2085738
self.thread = None
self.index = None
self.img = None
接下来就是接受数据:在我们的另一个窗口data_item_window中connect:
def init_slots(self):
self.pushButton_to_tag.clicked.connect(lambda: self.data_item_window.getInfo_from_reTag(self.tagList))
其中getInfo_from_reTag()方法为具体接受信号的方法:
def getInfo_from_reTag(self, list):
self.re_tag_list = list
print(list)
self.img_file_name = self.re_tag_list[0]
self.GetImgPathlineEdit.setText(str(self.re_tag_list[0]))