You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:48:13