QT 队列触发连接

voi*_*oid 5 c++ qt signals-slots

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

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

因此,仅仅在itemChange()完成后连接setFlag(QGraphicsItem::ItemSendsScenePositionChanges, true);就太昂贵了: GUI由于每次移动都会进行新的计算而冻结。


我想将连接排队为仅触发,假设每 500 毫秒触发一次,而不是每次移动时触发一次。(或者 500 毫秒没有用户输入后)

Bot*_*tje 1

创建一个超时时间为 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);
Run Code Online (Sandbox Code Playgroud)

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

QObject::connect(item, &QGraphicsItem::itemChanged, t, &QTimer::start);
Run Code Online (Sandbox Code Playgroud)