• 7858阅读
  • 10回复

如何做等待頁面 [复制链接]

上一主题 下一主题
离线seeing
 

只看楼主 倒序阅读 楼主  发表于: 2012-11-25
假設要載入一張大圖檔,並做一些處理後要 5 秒,希望在這段期間內能顯示一個等待的視窗,類似 http://www.lanrentuku.com/gif/a/loading.html 。原本我是用 QT 裡面的 sample 去做的


但裡面用的是 timer 來重繪,遇到開始載入圖片時就會停住不會動,等載入完畢才會繼續動。

有什麼方法可以讓達成載入大圖片時又可以顯示動畫?

謝謝

离线XChinux

只看该作者 1楼 发表于: 2012-11-25
先看能否将你的处理过程放到另一个线程中去处理。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线彩阳

只看该作者 2楼 发表于: 2012-11-25
回 楼主(seeing) 的帖子
开一个线程处理吧。
上海Qt开发联盟,热忱地欢迎你的加入!
离线seeing

只看该作者 3楼 发表于: 2012-11-25
我想把動畫的部份放到另一支執行緒中,但只要是 GUI 的都不行放進去吧
离线XChinux

只看该作者 4楼 发表于: 2012-11-25
如果还搞不定,那就在长时间处理图像文件时定时调用QApplication::processEvents();以及时处理其它事件(处理显示那个等待图标、键盘输入等等)
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线seeing

只看该作者 5楼 发表于: 2012-11-25
程式大約長這樣
  1. Window w;    //等待視窗
  2.     w.show();
  3.     QPixmap pixmap;
  4.     pixmap.load("D:/01.bmp");
  5.     pixmap = pixmap.scaled(200, 200);
  6.     pixmap = pixmap.scaled(100, 100, Qt::KeepAspectRatio, Qt::SmoothTransformation);
  7.     QLabel label;
  8.     label.setFixedSize(100, 100);
  9.     label.setPixmap(pixmap);
  10.     label.show();
  11.     w.close();
圖檔載入的過程中應該很難拆開加入 QApplication::processEvents(); 吧

离线piaoliushi

只看该作者 6楼 发表于: 2012-11-26
1)pixmap没load完,你show啥呀?
2)你这两个scaled吓死人,太影响效率。
建议:
不要在程序中调整尺寸,找合适的尺寸图片做为切换素材。
离线ppdayz

只看该作者 7楼 发表于: 2012-11-27
顶楼上
很多时候,你敲200行代码,不如美工的一张图
离线seeing

只看该作者 8楼 发表于: 2012-11-27
好吧,我再試試看有沒有其它的替代方案,謝謝大家的回覆
离线seeing

只看该作者 9楼 发表于: 2012-11-28
在網路上找到一篇文章 http://blogs.kde.org/2011/01/22/loading-and-scaling-images-thread,用這種方式將動畫放在主程式,載入/縮放影像放在執行緒中處理,已經可以達到需求了
离线meibined

只看该作者 10楼 发表于: 2012-12-04
有好几种做法:
1、把等待处理的东西弄到线程里面处理,主线程显示一个模态对话框。(不好用,因为QT的子线程不能操作UI,如果你需要操作UI的话)。
2、只用一个主线程来进行处理,把你的5秒处理过程弄成回调函数,回调指针传到模态对话框里面。
大致这样:
void ShowModelDlg(..., pFun *pCallbackFun)
{
     DialogMsg *pDlg = new DialogMsg(..., MSGTYPE_CANCEL);
     pDlg->setModel(ture);
     Show(pDlg);
     pCallBackFun();
     pDlg->hide();
     delete pDlg;
      pDlg = NULL;
}//ShowModelDlg()全局函数,供其他文件调用,pCallbackFun是你要执行的那个等待操作的函数指针。
3、弄一个QFrame盖在父窗口上,然后新建个QLabel进行加载一个转圈等待的那个gif。
然后对QFrame和Qlabel位置进行控制。
注,可以弄成单例模式供其他地方调用
大致实现是这样:
CWaitFrame::CWaitFrame()
{
   m_pLabel = new QLabel(this);
   m_pMovie = new QMovie("Movie,gif");
   //设置背景色
...;
//设置透明度为半透明
....;
}

void CWaitFrame::Show(QWidget* parent,.....)//需要什么参数自己在加成有默认参数的
{
  if(m_parent != parent)
{

   setParrent(parent);//要覆盖的窗口指针
   //调整CWaitFrame大小为父窗口的指针
   resize(...);
   // 设置m_pLabeld的显示位置
    m_pLabel->setGeomeng(...);
}
m_pLabel->setMovie(m_pMovie);
m_pMovie->start();
}
void CWaitFrame::Hide(.....)
{
//结束时候调用这个
}
然互通过模板写哥单例类
记得一点:
然互通过模板写哥单例类把CWaitFrame用弄成单例模式,大家都可以方便调用;
到时候大概这样调用
TheSigleWaitFrame::inistanc()->Show(...)
没VS2008不方便写,写个大概,希望看得懂
快速回复
限100 字节
 
上一个 下一个