• 857阅读
  • 8回复

[讨论]关于加载界面进度值在主界面初始化时没有变化的问题 [复制链接]

上一主题 下一主题
离线lwei24
 

只看楼主 倒序阅读 楼主  发表于: 2023-02-16
如题,在主界面显示前,做了一个加载界面,通过QSplashScreen派生出LoaderWidget 加载子类,使用如下:
  1. //LoaderWidget类
  2. void NetacLoader::updateNum(int num)
  3. {
  4.     m_value = num;
  5.     DEBUG_LOG_PRINT(QString("0.ProgressBar Value = %1").arg(QString::number(m_value)));
  6.     QTime time = QTime::currentTime().addMSecs(500);
  7.     while (QTime::currentTime()<time)
  8.     {
  9.         QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
  10.     }
  11.     m_progressBar->setValue(num);
  12. }
  13. int main(int argc, char *argv[])
  14. {
  15.     QApplication app(argc, argv);
  16.     LoaderWidget *loader = new LoaderWidget(":/image/start/loading.jpg");
  17.     loader->SetRange(0, 100);
  18.     loader->show();
  19.     int i = 0;
  20.     while(i <= 100)
  21.     {
  22.         loader->updateNum(i);
  23.         i++;
  24.     }
  25.     
  26.     FrmMain w;  //--------->位置1:此处开始loader加载界面的进度值没有变化
  27.     loader->finish(&w);
  28.     delete loader;
  29.     loader = NULL;
  30.     w.show();
  31.     return app.exec();
  32. }
在loader上的进度条上的值是从左往右开始动态变化的,但是在位置1的地方,进度条开始没有变化了,各位大佬,有什么办法可以在进入FrmMain初始化控件的时候,让进度条也一起开始变化呢?欢迎各位大佬指点一二,小弟感激不尽!!


离线wanger233

只看该作者 1楼 发表于: 2023-02-17
FrmMain w;换换成QWidget 确认下是用法问题还是你的代码有问题
离线fsu0413

只看该作者 2楼 发表于: 2023-02-17
UpdateNum在w的构造函数里调用
离线lwei24

只看该作者 3楼 发表于: 2023-02-17
回 wanger233 的帖子
wanger233:FrmMain w;换换成QWidget 确认下是用法问题还是你的代码有问题 (2023-02-17 13:49) 

不是这个问题,换QWidget也是一样。因为FrmMain是继承QWidget的,主要是FrmMain主窗口有很多控件信息需要初始化,某些信息需要通过后台调用命令获取,程序运行到位置1的地方,此刻加载界面的进度值已经刚好到10,结果因为一直在做FrmMain主窗口的初始化,那个加载窗口的进度值好像就没有变化了,停了几十秒……
离线lwei24

只看该作者 4楼 发表于: 2023-02-17
回 fsu0413 的帖子
fsu0413:
UpdateNum在w的构造函数里调用

试过,在主窗口的构造函数里调用也是一样的,例如:
  1. #include <QApplication>
  2. #include "frmmain.h"
  3. //main.cpp
  4. int main(int argc, char *argv[])
  5. {
  6.     QApplication app(argc, argv);
  7.     FrmMain w;
  8.     w.show();
  9.     return app.exec();
  10. }
  11. //frmmain.cpp
  12. #include "frmmain.h"
  13. #include "loaderwidget.h"
  14. FrmMain::FrmMain(QWidget *parent)
  15.   : QDialog(parent)
  16. {
  17.       LoaderWidget *loader = new LoaderWidget(":/image/start/loading.jpg");
  18.     loader->SetRange(0, 10);
  19.     loader->show();
  20.     int i = 0;
  21.     while(i <= 10)
  22.     {
  23.         loader->updateNum(i);
  24.         i++;
  25.     }
  26.    this->initUI();//此处初始化控件信息,进度值没有变化,大概停了十几秒,初始化完了,才会变。
  27.    loader->finish(this);
  28.     delete loader;
  29.     loader = NULL;
  30. }


离线clickto

只看该作者 5楼 发表于: 2023-02-17

    while(i <= 10)
    {
QCoreApplication::processEvents();//这里也添加这句试试看
        loader->updateNum(i);
        i++;
    }
离线lwei24

只看该作者 6楼 发表于: 2023-02-20
回 clickto 的帖子
clickto:    while(i <= 10)
    {
QCoreApplication::processEvents();//这里也添加这句试试看
        loader->updateNum(i);
....... (2023-02-17 20:34) 

在那里加QCoreApplication::processEvents();试了,没有多用,因为一旦while中的i == 11后,loader上的进度条就停了几十秒不动,进入FrmMain构造函数里初始化一些控件和获取一些必要的信息。
离线wanger233

只看该作者 7楼 发表于: 2023-02-20
多线程吧  moveToThread
找需要单独线程的或者干脆全部都丢另外线程
离线lwei24

只看该作者 8楼 发表于: 2023-02-20
回 wanger233 的帖子
wanger233:多线程吧  moveToThread
找需要单独线程的或者干脆全部都丢另外线程 (2023-02-20 09:51) 

没用吧,开辟新线程只是避免主界面卡顿,现在主界面不是卡顿,只是主界面之前的加载界面进度条因为主界面初始化控件和数据停顿了几十秒,这个停顿的时间,我想要的效果是主界面初始化时,进度条的值也在变化……
快速回复
限100 字节
 
上一个 下一个