QT очереди, запущенные соединения - PullRequest
4 голосов
/ 26 мая 2020

Каков наилучший / наиболее значимый способ поставить в очередь запущенные соединения в одном потоке, чтобы не замораживать gui?

Например, у меня есть QGraphicsScene, где я могу свободно перемещать QGraphicsItem. Я хочу начать трудоемкое обсуждение с текущей позиции элемента. Но одного единственного вычисления достаточно, чтобы не распознать зависание gui.

Итак, простое подключение к itemChange() после выполнения setFlag(QGraphicsItem::ItemSendsScenePositionChanges, true); слишком дорого: GUI зависает из-за новых вычислений на каждом шаге.


Я хочу поставить соединение в очередь, чтобы оно запускалось, скажем, каждые 500 мс, а не на каждом шаге. (Или после 500 мс без ввода данных пользователем)

1 Ответ

1 голос
/ 26 мая 2020

Создайте таймер с таймаутом 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);
...