PyQtGUI:如何存储数据(类对象)?

2024-09-30 06:34:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近开始编程python,并编写了第一个GUI,用于使用PyQt对NMR数据进行后处理和评估。应用程序的当前版本如下所示: screenshot of the pyqt app

典型的工作流程是:

  1. 读取各种实验数据(通常为3D或4D(2D/3D+时间/频率)图像堆栈)
  2. 做一些后处理,如定义感兴趣区域(ROI)、时间/频率分辨光谱的拟合、对比度的计算等等
  3. 在GUI中可视化结果
  4. 以带有拟合结果的图像/绘图/表格形式导出结果(xml)
  5. 保存工作区以重新加载

4d图像堆栈与实验设置、图像重建设置、拟合结果等一起存储为我自己的MriData类的类对象:

class MriData:
   def __init__(self, path='', exp_num=0, exp_name=''):
       self.path = path
       self.exp_num = exp_num
       self.exp_name = exp_name    
       self.img_stack = np.array([])
       self.ROIs = []  # list of ROIs  
       self.settings= {}
       self.lmfit = {}
       ...

目前,我的主窗口有一个类型为list的“mri_data”属性,在这里我存储了所有的数据/类对象。如果我在左侧的QTreeWidget中选择(多个)实验和/或ROI,我总是检查该项目是否是顶级项目,获取该实验的索引(如果是ROI的索引),然后在“mri_data”列表中访问相应的列表项:

^{pr2}$

这是可行的,但显然不是很好,我很确定它是非常低效的。这就是我写这篇文章的原因。我读到我可以在QTreeWidgetItems中存储数据,但是在重写整个代码之前,我想问问专家这是不是个好主意。如果存储的数据非常大,我就找不到任何关于性能的信息(4d堆栈高达256x256x32x2500,而我同时在QTreeWidget中进行了数百次实验)。或者使用完全不同的数据库方法更好?不幸的是(至少对我来说)很难找到关于类似问题的教程或帖子。。。也许是因为我用错了关键词?!在

提前感谢您的回答/提示/链接等


Tags: 数据path对象name图像self堆栈时间
1条回答
网友
1楼 · 发布于 2024-09-30 06:34:23

我测试了我在QTreeWidgetItems中存储数据的实现已经很长时间了,至少在我的例子中,它工作得很有魅力。例如,添加新项目非常舒适:

def add_dataset(self, _obj):
    """adds new QTreeWidgetItem when 'addItemSignal' is emitted from ImportDataDialog"""
    tree_obj = QtWidgets.QTreeWidgetItem([_obj.name])
    tree_obj.setData(1, QtCore.Qt.UserRole, _obj)
    self.treeWidget.addTopLevelItem(tree_obj)

不过,对我来说,最好的方法是使用QDataStream来保存/加载工作区:

^{pr2}$

这是相应的加载函数(我希望它能工作;我的保存/加载函数实际上更高级):

def action_loadworkspace_triggered(self, filename):
    """Loads workspace from file"""

    # open the file and create datastream
    file = QtCore.QFile(filename)
    file.open(QtCore.QIODevice.ReadOnly)
    datastream = QtCore.QDataStream(file)
    root_item = self.treeWidget.invisibleRootItem()

    # read all data from the file and create a TreeWidgetItem for each entry
    for n in range(datastream.readUInt32()):
        item = QtWidgets.QTreeWidgetItem(root_item)
        item.read(datastream)
        data = item.data(1, QtCore.Qt.UserRole)

我仍然不确定这是否是最有效的方法,但至少对于我的应用程序,我没有遇到任何性能问题等

相关问题 更多 >

    热门问题