如何不通过继承在PyQt两个类间传值,实现设置窗口选gif后主窗口播放
实现方案
你现有代码的问题是直接修改Main类的类属性后没有触发gif刷新逻辑,PyQt跨窗口传参最标准的实现是用自定义信号槽,修改如下:
步骤1:给Settings窗口新增自定义信号
导入信号类后在Settings类中定义信号,点击确定按钮时发射信号传递选中的文件名,不需要直接修改其他类的属性,耦合度更低。
步骤2:Main窗口绑定信号自动刷新gif
Main初始化时将Settings的自定义信号和自身的gif刷新方法绑定,只要Settings发射信号,Main就会自动加载新的gif播放。
完整修改后代码
import sys import traceback from PyQt5 import uic from PyQt5.QtGui import * from PyQt5.QtCore import pyqtSignal from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget def except_hook(cls, exception, traceback): sys.__excepthook__(cls, exception, traceback) class Settings(QWidget): # 自定义信号:参数为选中的gif文件名 gif_selected = pyqtSignal(str) def __init__(self): super().__init__() uic.loadUi('settings.ui', self) self.PB_OK.clicked.connect(self.close_this_window) # 修复原列表中部分文件名缺失.gif后缀的问题 self.all_gifs = ['cosmowave1.gif', 'cosmowave2.gif', 'cosmowave3.gif', 'retrowave1.gif', 'retrowave2.gif'] self.CB_chooseGifs.addItems(self.all_gifs) def close_this_window(self): # 取当前选中的文件名,发射信号 selected_gif = self.CB_chooseGifs.currentText() self.gif_selected.emit(selected_gif) self.close() class Main(QMainWindow): def __init__(self): super().__init__() uic.loadUi('mainWindow.ui', self) init_gif = 'cosmowave1.gif' self.movie = QMovie(self) self.add_a_gif(f'gifs/{init_gif}') # 创建设置窗口,绑定信号到刷新方法 self.settings_window = Settings() self.settings_window.gif_selected.connect(self.update_gif) self.settings_PB.clicked.connect(self.settings) def add_a_gif(self, gif_image): self.movie.setFileName(gif_image) self.GIF_LBL.setMovie(self.movie) self.movie.start() def update_gif(self, gif_name): # 拼接路径后刷新gif self.add_a_gif(f'gifs/{gif_name}') def settings(self): self.settings_window.show() if __name__ == '__main__': sys.excepthook = except_hook app = QApplication(sys.argv) ex = Main() ex.show() sys.exit(app.exec_())
内容的提问来源于stack exchange,提问作者BoggyDoggyBoo
相关产品推荐
相关产品推荐

