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