在QT GUI应用程序中处理事件时是否可以播放加载动画指示器?

时间:2017-07-17 08:42:56

标签: c++ qt

下面是我的代码,我已经解决了我的问题。最后我在堆栈溢出团队的帮助下得到了解决方案。如果你在工作线程中执行长任务,可以在主线程上播放动画(.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;
}

1 个答案:

答案 0 :(得分:2)

如果main loop因为正在处理事件而很忙,它将更新GUI(因为GUI由主线程管理)。

当您处理任务很长时,请在a different thread中执行它们(或接受冻结您的GUI)。


正如我所说的,GUI必须并且在主线程中必须进行管理:

  

GUI线程和辅助线程

     

如上所述,每个程序在启动时都有一个线程。这个   线程被称为“主线程”(也称为“ GUI线程”   Qt应用程序)。 Qt GUI必须在此线程中运行。所有小部件和   几个相关的类(例如QPixmap)在辅助类中不起作用   线程。辅助线程通常称为“工人”   线程”,因为它用于从主服务器上分担处理工作   线程。