【发布时间】:2012-11-26 03:20:47
【问题描述】:
我正在使用 PyQt 开发一个 GUI。 GUI 有一个 qListWidget、一个 qTableWidget 和一个用 Mayavi 实现的绘图。该列表指的是绘制的形状(例如圆柱体和圆锥体)。在列表中选择形状时,我希望将形状的属性加载到表中(从字典变量),并在图中突出显示形状。我的 Mayavi 绘图工作正常。另外,如果表格被编辑,我需要重新绘制形状,以反映新的属性值(如圆柱体,如果半径改变)。
So, when a list item is selected -> update the table with the item's properties (from a dictionary variable), highlight the item on the plot
当表格被编辑时 -> 更新字典变量并重新绘制项目
问题:当我选择一个列表项并将数据加载到表格中时,每次更新单元格时都会触发 qTableWidget ItemChanged 信号,这会触发多次重新绘制不完整数据的形状。
在以编程方式更新表时,是否有禁用 GUI 事件循环的典型方法? (我有使用 Excel VBA 的经验,在该上下文设置 Application.EnableEvents=False 将阻止每次以编程方式更新单元格时触发 WorksheetChange 事件。) 我是否应该有一个“正在进行表更新”变量以防止在更新表时采取行动? 有没有办法一次更新表格小部件而不是逐项更新? (我承认我暂时有意避免使用 Model-View 框架,因此使用 qListWIdget 和 qTableWidget)。
有什么建议吗?
我是第一次发帖,但 StackOverflow 的长期用户,所以我只想提前感谢您成为如此棒的社区!
【问题讨论】:
-
万一其他人落在这里:PyQt 为所有 QObjects(所有小部件和任何可以发送信号的东西)提供 blockSignals() 方法。 doc.qt.digia.com/stable/qobject.html#blockSignals 为了防止小部件发送信号,widget.blockSignals(True) 可以解决问题。您可以使用 widget.signalsBlocked() 检查阻塞状态。使用 widget.blockSignals(False) 重新打开信号。这在填充可能不需要 itemChanged 信号的小部件时特别有用。
标签: python pyqt pyqt4 qtablewidget