學(xué)習(xí)了QPainter基礎(chǔ)繪制后,接下來,來學(xué)習(xí)QPainter其它函數(shù)之rotate()函數(shù)
首先來看看QPainter其它函數(shù)
void QPainter::drawPixmap ( int x, int y, int w, int h,const QPixmap & pixmap, int sx, int sy, int sw, int sh );//繪畫pixmap// x y w h:表示本身的繪畫面積//sx sy sw sh:表示pixmap的繪畫面積void QPainter::drawPixmap ( int x, int y, const QPixmap & pixmap, int sx, int sy, int sw, int sh );//繪畫pixmap// x y 表示繪畫起始位置//sx sy sw sh:表示pixmap的繪畫面積drawTiledPixmap ( int x, int y, int width, int height, const QPixmap & pixmap,int sx = 0, int sy = 0 );//平鋪pixmapvoid QPainter::translate ( qreal dx, qreal dy );//將坐標(biāo)(dx,dy)設(shè)置顯示原點void scale ( qreal sx, qreal sy )//設(shè)置圖片縮放,sx(橫坐標(biāo)放大系數(shù)),sy(縱坐標(biāo)放大系數(shù))void rotate ( qreal angle ); //旋轉(zhuǎn)繪畫區(qū)域(比如斜文本),angle=90,則表示90度//以時針方向旋轉(zhuǎn)(順時針)rotate()函數(shù)分析
(資料圖片)
如果沒有通過translate()設(shè)置中心原點,則默認(rèn)將圖片以(0,該圖片的高)為原點
示例1-未設(shè)置原點中心時
QPainter painter(this);for(int i=0;i<10;i++){painter.save();painter.rotate(i*10);painter.drawText(100,100,\"123\");painter.restore();}如上圖,可以看到原點位于窗口最左側(cè). ,并且高度等于最右邊位置
示例2-設(shè)置原點中心后
static int rotate = 0;QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing,true);painter.translate(width()/2,height()/2);painter.drawRect(-2,-2,4,4);painter.setFont(QFont(0,11));for(int i=0;i<10;i++){painter.save();painter.rotate(i*36);painter.drawText(100,0,20,20,Qt::AlignCenter,QString(\"%1\").arg(i));painter.restore();}效果:
從上圖可以看到旋轉(zhuǎn)的同時,文字也跟著傾斜了,接下來,我們來自己寫個rotate()函數(shù),不讓文字傾斜
示例3-文字不傾斜旋轉(zhuǎn)
/* point: 文字所在的點* from_angle : 文字所在的度數(shù)* rotate : 需要旋轉(zhuǎn)的角度,值為-360~360(為負(fù)數(shù)表示逆時針旋轉(zhuǎn),為正數(shù)表示順時針旋轉(zhuǎn))*/QPoint Widget::CustomRotate(QPointF point,qreal from_angle,qreal rotate){qreal PI=3.141592653589;QPointF Tmp;qreal arc = (rotate-from_angle)/180*PI;qreal Length = qSqrt(point.x()*point.x() +point.y()*point.y());Tmp.setX(Length*qCos(arc));Tmp.setY(Length*qSin(arc));return Tmp.toPoint();}void Widget::paintEvent(QPaintEvent *){int angle = 0;QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing,true);painter.translate(width()/2,height()/2);painter.drawRect(-2,-2,4,4);painter.setFont(QFont(0,11));QPoint point(100,0); //從(100,0)開始填文字for(int i=0;i<10;i++){painter.drawText(point.x()-10,point.y()-10,20,20,Qt::AlignCenter,QString(\"%1\").arg(i));point=CustomRotate(point,angle, 36); //以當(dāng)前angle度,順時針旋轉(zhuǎn)36度angle -=36; //更新度數(shù),由于順時針,所以用減}}效果:
示例4-通過選擇加載圖片實現(xiàn)等待效果
代碼如下:
Widget::Widget(QWidget *parent) :QWidget(parent),m_rotate(false){resize(300,300);connect(&timer,SIGNAL(timeout()),this,SLOT(timerout()));timer.start(40);}void Widget::timerout(){m_rotate =true;update();}void Widget::paintEvent(QPaintEvent *){static int rotate = 0;QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing,true);painter.translate(width()/2,height()/2);if(m_rotate){rotate = (rotate+5)%360;m_rotate =false;}painter.rotate(rotate);QPixmap pix(\":wait\");painter.drawPixmap(-pix.width()/2,-pix.height()/2,pix);}【領(lǐng) QT開發(fā)教程 學(xué)習(xí)資料, 點擊下方鏈接莬費領(lǐng)取↓↓ ,先碼住不迷路~】
點擊這里:
標(biāo)簽:















