如何在Qt Squish中判断AbstractItemModel何时完成更新
确保QTableView完成更新后再执行结果检查(Squish + Python)
我之前在做Qt应用的Squish测试时,也碰到过QTableView因为Qt内部事件排队导致更新延迟的问题,直接做断言经常会失败。下面几个方案亲测有效,能帮你精准等待表格完成更新:
方法1:基于预期数据的条件等待(最推荐)
这种方式是轮询检查表格的目标单元格数据是否符合预期,直到满足条件或超时,完全贴合业务场景,可靠性最高。
示例代码:
def wait_for_table_cell(table_object, expected_value, row=0, column=0, timeout=5000): def check_condition(): # 通过模型获取单元格的实际数据(Squish中可以直接访问Qt对象的属性和方法) model_index = table_object.model().index(row, column) actual_value = str(model_index.data()) return actual_value == expected_value # 使用Squish内置的waitFor函数等待条件成立 if not waitFor(check_condition, timeout): raise AssertionError(f"超时!表格未更新到预期值:{expected_value}") # 使用示例:假设修改操作后,要等待第0行第0列变成"Updated Data" table = waitForObject(":MyApp.MyTableView") wait_for_table_cell(table, "Updated Data") # 现在可以安全地执行结果检查了 assert str(table.model().index(0,0).data()) == "Updated Data"
方法2:等待Qt事件循环处理完毕
如果不确定具体的预期数据,或者需要等待整个表格的布局/数据全部刷新,可以强制让Qt处理完所有待处理的事件:
from squish import QApplication # 触发修改模型的操作后,调用以下代码 app = QApplication.instance() # 等待所有待处理事件,包括表格的更新事件 app.processEvents(QApplication.ProcessEventsFlag.WaitForMoreEvents) # 可选:如果担心还有后续事件,可以多调用一次 app.processEvents(QApplication.ProcessEventsFlag.WaitForMoreEvents)
不过这种方式要注意:如果表格的更新依赖异步操作(比如后台线程修改模型),单次processEvents可能不够,还是结合方法1更稳妥。
方法3:监听表格的更新信号
Qt的QTableView在模型数据变化时会触发dataChanged或layoutChanged信号,你可以在Squish中临时连接这些信号,等待信号触发后再继续执行:
from squish import QObject, Signal def wait_for_table_signal(table_object): signal_triggered = False def on_data_changed(): nonlocal signal_triggered signal_triggered = True # 连接dataChanged信号 QObject.connect(table_object.model(), Signal("dataChanged(QModelIndex,QModelIndex)"), on_data_changed) # 等待信号触发,最多5秒 if not waitFor(lambda: signal_triggered, 5000): raise AssertionError("表格未触发dataChanged信号") # 断开信号连接,避免影响后续测试 QObject.disconnect(table_object.model(), Signal("dataChanged(QModelIndex,QModelIndex)"), on_data_changed) # 使用示例 table = waitForObject(":MyApp.MyTableView") wait_for_table_signal(table)
这个方法适合需要等待整个模型更新完成的场景,但要注意如果模型多次触发dataChanged,可能需要调整逻辑(比如计数触发次数)。
内容的提问来源于stack exchange,提问作者Pete Reiter
相关产品推荐
相关产品推荐

