voi*_*oid 5 c++ qt signals-slots
在一个线程中对触发的连接进行排队而不冻结 gui 的最佳/最重要的方法是什么?
例如,我有一个 QGraphicsScene,我可以在其中自由移动 QGraphicsItem。我想开始对当前项目位置进行耗时的计算。但一次计算速度足够快,无法识别 GUI 冻结。
因此,仅仅在itemChange()完成后连接setFlag(QGraphicsItem::ItemSendsScenePositionChanges, true);就太昂贵了: GUI由于每次移动都会进行新的计算而冻结。
我想将连接排队为仅触发,假设每 500 毫秒触发一次,而不是每次移动时触发一次。(或者 500 毫秒没有用户输入后)
创建一个超时时间为 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)