flu*_*ak7 6 python pyqt pyqt4 qtablewidget
我正在使用PyQt开发GUI.GUI有一个qListWidget,一个qTableWidget和一个用Mayavi实现的图.列表指的是绘制的形状(例如圆柱和圆锥).当在列表中选择一个形状时,我希望将形状的属性加载到表中(从字典变量中)和要在图中突出显示的形状.我有Mayavi密谋工作正常.此外,如果编辑了表格,我需要重新绘制形状,以反映新的属性值(如圆柱体,如果半径已更改).
因此,当选择列表项时 - >使用项的属性(从字典变量)更新表,突出显示项目上的项目
编辑表时 - >更新字典变量并重新绘制项目
问题:当我选择一个列表项并将数据加载到表中时,每次更新单元格时都会触发qTableWidget ItemChanged信号,这会触发不完整数据重新绘制形状的次数.
在以编程方式更新表时,是否存在禁用GUI事件循环的典型方法?(我有使用Excel VBA的经验,在该上下文中设置Application.EnableEvents = False将阻止每次以编程方式更新单元格时触发WorksheetChange事件.)我是否应该有一个"表更新进行中"变量以防止在执行操作时采取操作表正在更新?有没有办法一次更新Table Widget而不是逐项更新?(我承认我现在故意避开模型 - 视图框架,因此qListWIdget和qTableWidget).
有什么建议?
我是第一次发布海报,但却是StackOverflow的长期用户,所以我只是想提前感谢这样一个非常棒的社区!
jdi*_*jdi 12
blockSignals(bool)用于抑制QObjects及其子类发出信号,从而防止任何其他对象在插槽中接收它们.但这是一种QObject方法.如果您专门试图阻止一个对象发出信号以响应您正在进行的更改,这可能会触发计算或插槽中的其他一些昂贵的处理,那么这就是您想要的.
但是,如果您的情况是重复更改导致一遍又一遍的昂贵的绘制操作(或者在窗口小部件上生成其他昂贵的事件),那么您可以使用禁用更新updatesEnabled(bool).此方法的一个好处是它以递归方式禁用目标窗口小部件的子窗口,从而防止它们也被更新.因此,在您再次启用之前,层次结构中的任
mainWidget.setUpdatesEnabled(False)
# do a bunch of operations that would trigger expensive events
# like repaints
mainWidget.setUpdatesEnabled(True)
Run Code Online (Sandbox Code Playgroud)
最终,它取决于您的问题的来源是来自触发信号还是触发小部件事件.阻止信号仍然允许窗口小部件处理其事件,但不会通知任何其他侦听器.updatesEnabled是一种包装大量列表/表/树更新的常用方法.之后再次启用时,将执行单个帖子更新.
对于任何继承的对象,可以暂时阻止信号QObject:
self.tableWidget.blockSignals(True)
# perform updates, etc
self.tableWidget.blockSignals(False)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8412 次 |
| 最近记录: |