我正在使用 PyQt 开发 GUI。 GUI 有一个 qListWidget、一个 qTableWidget 和一个用 Mayavi 实现的绘图。该列表指的是绘制的形状(例如圆柱体和圆锥体)。当在列表中选择形状时,我希望将形状的属性加载到表中(从字典变量),并在图中突出显示形状。我的 Mayavi 绘图工作正常。另外,如果编辑表格,我需要重新绘制形状,以反映新的属性值(就像圆柱体,如果半径发生变化)。
因此,当选择列表项时 -> 使用该项目的属性(来自字典变量)更新表,突出显示绘图上的该项目
编辑表格时 -> 更新字典变量并重新绘制项目
问题:当我选择一个列表项并将数据加载到表中时,每次更新单元格时都会触发 qTableWidget ItemChanged 信号,这会触发使用不完整的数据多次重新绘制形状。
当以编程方式更新表时,是否有禁用 GUI 事件循环的典型方法? (我有使用 Excel VBA 的经验,在这种情况下,设置 Application.EnableEvents=False 将防止每次以编程方式更新单元格时触发 WorksheetChange 事件。)
我是否应该有一个“正在进行表更新”变量来防止在更新表时采取操作?
有没有办法一次性更新表格小部件而不是逐项更新? (我承认我暂时有意避免使用模型视图框架,因此使用了 qListWIdget 和 qTableWidget)。
有什么建议么?
我是第一次发帖,但却是 StackOverflow 的长期用户,所以我想提前感谢你们是一个如此出色的社区!
blockSignals(bool)
旨在抑制QObjects
及其子类发出信号,从而防止任何其他对象在槽中接收它们。但这是一个QObject
方法。如果您专门试图阻止一个对象发出信号来响应您所做的更改,这可能会触发计算或者在插槽中进行一些其他昂贵的处理,那么这就是您想要的。
但是,如果您的情况是进行重复更改会一遍又一遍地导致昂贵的绘制操作(或在小部件上生成其他昂贵的事件),那么您可以使用以下命令禁用更新:updatesEnabled(bool) http://qt-project.org/doc/qt-4.8/qwidget.html#updatesEnabled-prop。此方法的好处是它会递归地禁用目标小部件的子部件,从而防止它们也被更新。因此,在您再次启用之前,层次结构中的任何内容都不会收到更新。
mainWidget.setUpdatesEnabled(False)
# do a bunch of operations that would trigger expensive events
# like repaints
mainWidget.setUpdatesEnabled(True)
最终,这取决于问题的根源是来自触发信号还是触发小部件事件。阻止信号仍然允许小部件处理其事件,但只是不通知任何其他侦听器。updatesEnabled
是包装多个列表/表/树更新的常用方法。之后再次启用时,将执行一次后更新。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)