Qt创建窗口被阻塞不能及时显示的问题

⌚Time: 2022-07-23 11:09:13

👨‍💻Author: Jack Ge

在函数中动态创建窗口并显示时,如果后面有密集计算的代码,或者延时函数,会导致创建的窗口不能及时显示而被阻塞


    m_widget = new QWidget(get_handle());

    m_widget->resize (get_handle()->width(), get_handle()->height());

    m_widget->move (0,0);

    m_widget->setStyleSheet("background-color:rgba(0, 0, 0,80%);");

    m_widget->show();

    for(i = 0;i<99;i++){

        ...

    }

m_widget会在后面的for循环结束后才能得到显示,

对此的解决办法就是异步运行计算密集的代码,让他不能阻塞窗口的显示

将代码写入函数Calc


void Calc(){

    for(i = 0;i<99;i++){

        ...

    }

}

包含异步运行需要的头文件


#include <QtConcurrent/QtConcurrent>

#include <QFuture>

原来的代码改为


    m_widget = new QWidget(get_handle());

    m_widget->resize (get_handle()->width(), get_handle()->height());

    m_widget->move (0,0);

    m_widget->setStyleSheet("background-color:rgba(0, 0, 0,80%);");

    m_widget->show();

    

    QFuture<void> future = QtConcurrent::run(this, &MainWindow::Calc);

    while(!future.isFinished());

    {

        QApplication::processEvents(QEventLoop::AllEvents,100);

    }

之后窗口就可以马上显示了