Как я могу приостановить действие в реальном времени (Qt5)? - PullRequest
0 голосов
/ 16 марта 2020

У меня есть функция, которая читает некоторые команды и выполняет действия, связанные с этими командами. Проблема в том, что я хочу приостановить программу после каждой команды. Это мой код:

void MainWindow::moveDown(){

    QPoint l = ui->label->pos();
    int x = l.rx();
    int y = l.ry();
    if(y+50 <= 630){
        QPixmap pix(":/resources/img/Penguin.png");
        int w = ui->label->width();
        int h = ui->label->height();
        ui->label->setPixmap(pix.scaled(w,h,Qt::KeepAspectRatio));
        y = y+50;
        ui->label->setGeometry(x, y, 50, 50);
        //sleep(1);
    }
}

Как видите, я попробовал функцию sleep(), но она останавливает программу, прежде чем метка начинает двигаться. Что еще мне попробовать?

1 Ответ

0 голосов
/ 16 марта 2020

Я реализовал эту функцию много лет go, которую я использую с тех пор. Он поддерживает событие l oop, чтобы пользовательский интерфейс не зависал во время сна. Это делается путем выполнения локального события l oop для запрошенного количества миллисекунд. Он также прерывает l oop, если приложение хочет выйти:

/*
 * Sleep for 'ms' milliseconds without freezing the UI.
 */
void sleepLoop(const long ms)
{
    QEventLoop idle_loop;
    QTimer timer;
    timer.setSingleShot(true);
    QObject::connect(&timer, &QTimer::timeout, &idle_loop, &QEventLoop::quit);
    QObject::connect(qApp, &QCoreApplication::aboutToQuit, &idle_loop, &QEventLoop::quit);
    timer.start(ms);
    idle_loop.exec();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...