遇到一个问题,加载一张图片并使其定时旋转,类似电脑加载程序时鼠标的旋转效果.目前遇到的问题有3个:
1.不断加载图片的过程导致本模块占用CPU率高.
2.图片在旋转时有轻微抖动.
3.图片旋转时有锯齿.
如下是代码:
1).在构造函数中定义定时器m_loadtimer和图标的背景label:
QTimer* m_loadtimer;
NGILabel* m_syniconlabel;
TextSyncSMS::TextSyncSMS(QWidget *parent) : QWidget(parent)
,CView(eViewId_SyncSMS)
,m_loadtimer(new QTimer(this))
{
this->m_syniconlabel = new NGILabel(this);
this->m_syniconlabel->setGeometry(375,227,59,59);
this->m_syniconlabel->setAlignment(Qt::AlignCenter);
this->m_syniconlabel->setStyleSheet("background:transparent;"); m_loadtimer->setSingleShot(false);
connect(m_loadtimer,SIGNAL(timeout()),this,SLOT(onTimerout()));
}
2).在整个页面显示的时候调用函数restartTimer():
INFO("TextSyncSMS::StateAction() call restartTimer() ")
restartTimer();
this->show();
3).在函数restartTimer()中调用onTimerout():
void TextSyncSMS::restartTimer()
{
m_loadtimer->start(100);
i_Angle = 0;
INFO("called the onTimerout")
onTimerout();
}
4).在函数onTimerout()中实现旋转:
void TextSyncSMS::onTimerout()
{
++i_Angle;
i_Angle = i_Angle % 36;
QImage image;
QMatrix matrix;
image.load(":/UI/Picture_resource/Text_SVG/Text_Icon_Loading.svg");
INFO("load the icon ")
matrix.rotate(360 - 10.0 * i_Angle);//页面旋转
INFO("rotate the icon")
image=image.transformed(matrix,Qt::SmoothTransformation);
m_syniconlabel->setPixmap(QPixmap::fromImage(image));
}
自己百度查了下:
1.抖动有几种,边缘锯齿和图像偏移
做一个固定的matrix,然后做一个临时用的matrix,为基本matrix的rotate(x*time).因为你用一个matrix不停的rotate肯定会导致锚点偏的越来越远的
2.Qt::SmoothTransformation比Qt::FastTransformation清晰度高,但是CPU占用率也高
最终解决方法: