16,240
社区成员
发帖
与我相关
我的任务
分享
void LoadDialog::createDialog()
{
QLabel* gif_Label = new QLabel;
QMovie* gif_Movie = new QMovie(tr("E:/pixs/loading.gif"));
gif_Label->setFixedSize(100,100);
gif_Label->setMovie(gif_Movie);
gif_Movie->start();
gif_Label->show(); //设想这里可以播放gif
if(costTime_Dialog != NULL)
delete costTime_Dialog;
costTime_Dialog = new CostTimeDialog(this);//这行代码需要花费3-5秒时间
delete gif_Label;
costTime_Dialog->exec();
}
QLabel* info_Label = new QLabel;
info_Label->setFixedSize(200,100);
info_Label->setText("登录中。。。");
info_Label->show();
if(costTime_Dialog != NULL)
delete costTime_Dialog;
costTime_Dialog = new CostTimeDialog(this);
delete gif_Label;
costTime_Dialog->exec();
costTime_Dialog = new CostTimeDialog(this);
这句代码是生成一个窗体,所以肯定这句代码肯定会在主线程中执行,因此执行这句代码时候可以看做主线程被阻塞了,所以gif图片在这段时间里没法显示(gif用QLabel显示,也属于窗体,也位于主线程中),使用QProgressDialog,GIF在这段时间里不会动,处于停止状态[/quote]
怎么说呢,我是这样实现的
QProgressDialog drawProgress(tr("图像绘制进度"), tr("取消"), 0, sqlRow, this);
drawProgress.show();
for(uint i=0;i<sqlRow;i++)
{
/* 做一些数据处理 */
drawProgress.setValue(i);
QCoreApplication::processEvents();
if(drawProgress.wasCanceled())
{
/* 按了取消的情况 */
break;
}
/* 显示界面的处理 */
}
sqlRow是界面要处理的数据行数[/quote]
解决方法应该是 把这个for循环放入线程 可以很负责任的告诉你:别的任何方法都行不通。
costTime_Dialog = new CostTimeDialog(this);
这句代码是生成一个窗体,所以肯定这句代码肯定会在主线程中执行,因此执行这句代码时候可以看做主线程被阻塞了,所以gif图片在这段时间里没法显示(gif用QLabel显示,也属于窗体,也位于主线程中),使用QProgressDialog,GIF在这段时间里不会动,处于停止状态[/quote]
怎么说呢,我是这样实现的
QProgressDialog drawProgress(tr("图像绘制进度"), tr("取消"), 0, sqlRow, this);
drawProgress.show();
for(uint i=0;i<sqlRow;i++)
{
/* 做一些数据处理 */
drawProgress.setValue(i);
QCoreApplication::processEvents();
if(drawProgress.wasCanceled())
{
/* 按了取消的情况 */
break;
}
/* 显示界面的处理 */
}
sqlRow是界面要处理的数据行数costTime_Dialog = new CostTimeDialog(this);
这句代码是生成一个窗体,所以肯定这句代码肯定会在主线程中执行,因此执行这句代码时候可以看做主线程被阻塞了,所以gif图片在这段时间里没法显示(gif用QLabel显示,也属于窗体,也位于主线程中),使用QProgressDialog,GIF在这段时间里不会动,处于停止状态