Qt开发中如何将import_candy的all_data传递给show_candy方法?
解决Qt中Candy类方法间数据共享问题
核心思路是把all_data定义为Candy类的实例属性,让同一个Candy实例的import_candy和show_candy方法共享这个数据。具体修改如下:
修改File2的Candy类
- 在
__init__方法中初始化实例属性self.all_data,用于存储读取到的ODS数据 - 修改
import_candy方法,将读取到的数据赋值给self.all_data(按钮点击的槽函数返回值会被Qt忽略,无需return数据) - 在
show_candy方法中先判断self.all_data是否存在,避免未导入数据时触发错误,再使用self.all_data操作表格
修改后的File2代码:
import os import pandas as pd from PyQt5.QtWidgets import QFileDialog, QTableWidgetItem, QMessageBox class Candy(): def __init__(self, main_window): self.main_window = main_window # 初始化实例属性,存储ODS数据 self.all_data = None def import_candy(self): path = QFileDialog.getOpenFileName(None, 'Open ODS', os.getenv('HOME'), 'ODS(*.ods)')[0] # 未选择文件直接返回 if not path: return self.all_data = pd.read_excel(path, skiprows=5) if self.all_data.size == 0: self.all_data = None QMessageBox.warning(None, "提示", "导入的文件为空") return def show_candy(self): # 先判断是否已导入数据 if self.all_data is None: QMessageBox.warning(None, "提示", "请先导入ODS文件") return # 使用实例属性self.all_data操作表格 self.main_window.tableWidget.setRowCount(self.all_data.shape[0]) self.main_window.tableWidget.setColumnCount(self.all_data.shape[1]) self.main_window.tableWidget.setHorizontalHeaderLabels(self.all_data.columns) for row_idx, row in self.all_data.iterrows(): for col_idx, value in enumerate(row): tableItem = QTableWidgetItem(str(value)) self.main_window.tableWidget.setItem(row_idx, col_idx, tableItem)
关键说明
- 原
import_candy中的all_data是局部变量,仅在该方法作用域内有效,show_candy无法访问 - 实例属性
self.all_data属于单个Candy实例,每个界面实例对应独立的数据存储,比类级变量(所有实例共享)更适合当前场景 - 添加了空文件、未导入数据的提示,提升用户交互体验
内容的提问来源于stack exchange,提问作者HizaCrenata
相关产品推荐
相关产品推荐

