当从 CSV 加载数据时,QAbstractListModel 不会更新值,但在使用硬编码值时会更新

QAbstractListModel does not get updated with values when data is loaded from CSV, but it does when using hardcoded values

我已经在单个脚本中制作了一个按比例缩小的应用程序来专门解决这个问题。代码粘贴为here.

当我按下 "auto ROI" 时,应用程序只需获取 hard-coded 坐标并将它们绘制到 pyqtgraph 视图:

当我尝试 "load anatomical coordinates" 从文本文件(见下文)时,一切似乎都按预期工作,除了 ROI 的名称没有显示在右下角的 ROI 列表中。这个小部件是一个 RoiItemModel(这是一个 QAbstractListModel

这是我使用的文本文件:

1) ROI Name, 2) Length, 3) X Coordinate, 4) Y Coordinate
AC, 3, 0.5, 0.0
V1, 3, 2.5, -2.5
M2, 3, 1.5, 1.75
BC, 3, 3.5, -1.0
RS, 3, 0.5, -2.5
M1, 3, 1.0, 2.5
HL, 3, 2.0, 0.0
HL2, 4, -2.0, 0.0
HL3, 6, -3.5, 1.0

调试时我发现使用相同参数调用以下代码行似乎会给出两个不同的结果:

self.dataChanged.emit(self.index(row), self.index(row)) # in RoiItemModel

唯一不同的(据我所知)是在一种情况下我有我的数据 hard-coded(有效),在另一种情况下我使用 csv.reader 首先转换相同格式的值(不起作用)

奖金信息:

我将所有 rois 的路径保存到 JSON 文件,我使用 QSettings 在运行时加载它,以便列表立即填充 ROI 名称。在我的主程序中(不是 pastebein 示例),如果我退出我的程序并重新运行它,那么 roi 名称将从文件中加载并正确填充 RoiItemModel 以便名称显示。

我试过这样做,以便从 csv 加载的 ROI 的位置存储在 self.data - 正是 hard-coded 坐标存储的位置 - 然后只有在按下按钮后才会使用来自 self.data 的坐标来绘制 ROI 的 但它仍然失败

所以基本上是这样的:

奇怪。

有问题的代码在这里:

def load_ROI_table(self):
    ...
    roi_names = [roi_table[x, 0] for x in roi_table_range]
    print(roi_names)

这给出了这个非常具有误导性的输出:

['AC', 'V1', 'M2', 'BC', 'RS', 'M1', 'HL', 'HL2', 'HL3']

这在 numpy 中是一个非常糟糕的设计选择,因为该列表中的对象不是 python 字符串:

print(['%s %r' % (type(i), i) for i in roi_names])
...
["<class 'numpy.str_'> 'AC'", "<class 'numpy.str_'> 'V1'", "<class 'numpy.str_'> 'M2'", "<class 'numpy.str_'> 'BC'", "<class 'numpy.str_'> 'RS'", "<class 'numpy.str_'> 'M1'", "<class 'numpy.str_'> 'HL'", "<class 'numpy.str_'> 'HL2'", "<class 'numpy.str_'> 'HL3'"]

Qt 对这种 numpy 类型一无所知,所以你必须小心地将它们转换为普通的 python 类型:

roi_names = [str(roi_table[x, 0]) for x in roi_table_range]