QT队列触发的连接

问题描述 投票:3回答:1

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

例如我有一个QGraphicsScene,可以在其中自由移动QGraphicsItem。我想开始一个耗时的关于当前Item位置的讨论。但是,一次计算就足够快了,以至于不承认gui冻结。

因此,仅在执行itemChange()后才连接到setFlag(QGraphicsItem::ItemSendsScenePositionChanges, true);是太昂贵了:GUI冻结,因为每一步都进行了新的计算。


我想将连接排入队列,例如每500毫秒而不是每步移动。 (或在无用户输入的500ms之后)

c++ qt signals-slots
1个回答
0
投票

创建一个具有500ms超时的计时器,设置为运行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);
© www.soinside.com 2019 - 2024. All rights reserved.