首页 > 解决方案 > QT 队列触发连接

问题描述

在一个线程中对触发的连接进行排队以不冻结 gui的最佳/最可观的方法是什么?

例如,我有一个 QGraphicsScene,我可以在其中自由移动 QGraphicsItem。我想用当前的项目位置开始一个耗时的计算。但是一个单一的计算速度足够快,以至于无法识别 gui 冻结。

所以,只连接到itemChange()after doingsetFlag(QGraphicsItem::ItemSendsScenePositionChanges, true);太昂贵了:GUI 冻结,因为每一步都有新的计算。


我想将连接排队以触发,假设每 500 毫秒,而不是每次移动。(或在 500 毫秒无用户输入后)

标签: c++qtsignals-slots

解决方案


创建一个超时时间为 500 毫秒的计时器,设置为运行expensiveCalculation一次然后停止。

QTimer *t = new QTimer(this);
t->setInterval(500);
QObject::connect(t, &QTimer::timeout, t, &QTimer::stop);
QObject::connect(t, &QTimer::timeout, this, &expensiveCalculation);

现在将itemChanged信号连接到其start插槽。这将在每次触发信号时启动或重新启动计时器。如果 500 毫秒内没有出现新事件,则计时器关闭并开始expensiveCalculation

QObject::connect(item, &QGraphicsItem::itemChanged, t, &QTimer::start);

推荐阅读