下面是我的代码,我已经解决了我的问题。最后我在堆栈溢出团队的帮助下得到了解决方案。如果你在工作线程中执行长任务,可以在主线程上播放动画(.gif文件) 。其他的东西与官方文档一样QPixmap在工作线程中不支持。所以我希望有人为Qt开发人员提供帮助。
int worker::do_Work()
{
int i =0;
while (i<1000000)
{
qDebug()<<":count *i=========>"<<i;
i++;
}
qDebug()<<"Worker process finished in Thread "<<thread()->currentThreadId();
emit finished();
}
int mywidget::popup()
{
ui->label_2->setStyleSheet("background-color:rgb(85,255,127);border-radius:10px");
ui->label_2->setWindowFlags(Qt::FramelessWindowHint);
ui->label_2->setText("Please Wait..");
ui->label_2->setAutoFillBackground(true);
QMovie *movie = new QMovie(":images/loader.gif");
ui->label_2->setMovie(movie);
ui->label_2->show();
qDebug()<<"labele show";
movie->start();
myWorker = new worker;
WorkerThread = new QThread;
myWorker->moveToThread(WorkerThread);
connect(WorkerThread, SIGNAL(started()), myWorker, SLOT(do_Work()));
WorkerThread->start();
connect(myWorker, SIGNAL(finished()), ui->label_2, SLOT(close()));
return 0;
}
答案 0 :(得分:2)
如果main loop因为正在处理事件而很忙,它将不更新GUI(因为GUI由主线程管理)。
当您处理任务很长时,请在a different thread中执行它们(或接受冻结您的GUI)。
正如我所说的,GUI必须并且在主线程中必须进行管理:
GUI线程和辅助线程
如上所述,每个程序在启动时都有一个线程。这个 线程被称为“主线程”(也称为“ GUI线程” Qt应用程序)。 Qt GUI必须在此线程中运行。所有小部件和 几个相关的类(例如QPixmap)在辅助类中不起作用 线程。辅助线程通常称为“工人” 线程”,因为它用于从主服务器上分担处理工作 线程。