QT延迟运行功能

时间:2020-05-18 14:29:32

标签: c++ qt c++11 time delay

我想创建一个函数,比方说(qDebug()<<“ result”;)。我想在2秒后显示结果,延迟必须在此函数中实现。换句话说:

void MainWindow::my_function()
{
     // Here I need something to make a delay of 2 secs
      qDebug() << "result";
}

是否存在允许等待2秒钟然后执行下一行的方法或东西? 我正在寻找QT上最简单的方法。

2 个答案:

答案 0 :(得分:2)

我的建议是先阅读为什么睡眠是个坏主意,尤其是在涉及GUIS的情况下。 无论如何,您可以自qt5

Functions of QThread

void msleep(unsigned long msecs);
void sleep(unsigned long secs);
void usleep(unsigned long usecs);

在您的代码中使用此代码,您可以

void MainWindow::my_function(){
     // Here I need something to make a delay of 2 secs
     sleep(2);
     qDebug() << "result";
}

但是正如我之前说的,请读1st,因为这可以工作,但也会冻结主窗口,考虑用户体验等时,这不是一个好主意

答案 1 :(得分:2)

请勿(滥用)睡眠功能

睡眠功能是一种非常易于滥用的专用工具,Qt为您提供了许多更好的选择。因此,除非您知道自己在做什么,否则不要使用睡眠功能(如果只是为了避免养成不良习惯)。

那么,您有什么选择?

如果只需要2秒的延迟时间(例如,在用户按下按钮后),则可以使用QTimer::singleShot(),它会在计时器到期后调用该函数,例如

QTimer::singleShot(2000, this, &MainWindow::printResultFunction)

或者您可以使用本地QEventLoop,您将exec QEventLoop loop; QTimer::singleShot(2000, &loop, &QEventLoop::quit); loop.exec(); 然后使用计时器退出(再次),例如

        var data = grid.dataSource.data();

        for (i = 0; i < data.length; i++)
        {
            if (data[i].FirstName.trim() != "") {
                var obj = {};
                obj.FirstName = data[i].FirstName;
                obj.UserId = data[i].UserId;
            }
        }

或者您可以启动一个单独的线程来执行您的函数,并在此函数中使用( gasp QThread::msleep()正如我之前所说的,睡眠函数是一种专用工具-在这里您知道您在做什么。您不会停止GUI线程和qt事件。您正在暂停执行旨在执行一件事的线程:执行任务,等待2秒,执行更多任务并终止。