Python PyQt5:如何更新QabstracteModel中的同级?

Python PyQt5:如何更新QabstracteModel中的同级?,python,pyqt,pyqt5,qabstractitemmodel,Python,Pyqt,Pyqt5,Qabstractitemmodel,我正在使用PyQt5开发一个Python应用程序(WinPython3.4.3.2),并使用QabstracteModel 我设计了几个小部件来处理数据。GUI的两张图片表示一个示例。根据所选通道类型,输入参数的含义会发生变化:一些“输入”参数甚至可以从“输入”参数更改为计算值(如取决于内径和外径的液压直径,对于未来版本,一些输入参数根据所选通道类型设置为非活动) 更改通道类型或内径后,某些字段(最好是全部字段)必须由代码更新 我在setData函数中实现了以下功能: class Simul

我正在使用PyQt5开发一个Python应用程序(WinPython3.4.3.2),并使用QabstracteModel

我设计了几个小部件来处理数据。GUI的两张图片表示一个示例。根据所选通道类型,输入参数的含义会发生变化:一些“输入”参数甚至可以从“输入”参数更改为计算值(如取决于内径和外径的液压直径,对于未来版本,一些输入参数根据所选通道类型设置为非活动)


更改通道类型或内径后,某些字段(最好是全部字段)必须由代码更新

我在setData函数中实现了以下功能:

class SimulationDataModel(QAbstractItemModel):

    """INPUTS: Node, QObject"""
    def __init__(self, root=None, parent=None, filename=None):
        super(SimulationDataModel, self).__init__(parent)

    ....

    """INPUTS: QModelIndex, QVariant, int (flag)"""
    def setData(self,index,value, role=Qt.EditRole):

        if index.isValid():
            node = index.internalPointer()
            typeInfo = node.typeInfo()
            if role == Qt.EditRole:
                node.setData(index.column(),value)
                if typeInfo == "CHANNEL":
                    self.dataChanged.emit(index.sibling(index.row(),2) ,index.sibling(index.row(),14))
                else:
                    self.dataChanged.emit(index,index)
                self._dirty = True
                return True   
        return False
这意味着,对于模型的一部分,我为所有同级发出dataChanged信号,以便从模型中读取数据,并更新所有小部件/旋转框

问题是我遇到了严重的性能问题:

cProfiler统计数据:

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
     3   17.727    5.909   17.735    5.912 {method 'emit' of 'PyQt5.QtCore.pyqtBoundSignal' objects}
     1    6.479    6.479   26.203   26.203 {built-in method exec_}
     1    1.916    1.916    7.645    7.645 {question}
如果将带有dataChanged.emit的代码行更改为以下内容,则不会遇到性能问题

if typeInfo == "CHANNEL":
    self.dataChanged.emit(index,index)
else:
    self.dataChanged.emit(index,index)
但可以肯定的是,其他小部件/旋转框不再立即更新

我有以下问题:

在一个数据项更改后,是否有其他方法更新整个模型(或部分模型)? 在方法emit中每次调用花费很长时间的原因是什么? pyQtSignal和pyQtBoundSignal之间的区别是什么

我必须承认:性能问题并不是在每次运行应用程序时都会发生,有时(大约70%)会发生,有时不会发生。到目前为止,我还没有发现任何模式。此外,完整的GUI非常慢


到目前为止,我无法创建一个最小的工作示例,在这里我可以重现问题。

您是否连接到
dataChanged
信号?你的插槽功能是什么样子的?发出
dataChanged
信号的开销应该最小,但是监听信号的“刷新”功能可能非常昂贵且冗余。您是否连接到
dataChanged
信号?你的插槽功能是什么样子的?发出
dataChanged
信号的开销应该最小,但是监听信号的“刷新”功能可能非常昂贵且冗余。