31.QPainter-rotate()函數分析-文字旋轉不傾斜,圖片旋轉實現等待


在上章和上上上章:

28.QT-QPainter介紹 

30.QT-漸變之QLinearGradient、 QConicalGradient、QRadialGradient 

學習了QPainter基礎繪制后,接下來,來學習QPainter其它函數之rotate()函數

 

首先來看看QPainter其它函數

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 ); //平鋪pixmap

void QPainter::translate ( qreal dx, qreal dy ); //將坐標(dx,dy)設置顯示原點

void scale ( qreal sx, qreal sy ) //設置圖片縮放,sx(橫坐標放大系數),sy(縱坐標放大系數)

void  rotate ( qreal angle );  //旋轉繪畫區域(比如斜文本),angle=90,則表示90度  //以時針方向旋轉(順時針)

 

 

rotate()函數分析

如果沒有通過translate()設置中心原點,則默認將圖片以(0,該圖片的高)為原點

 

示例1-未設置原點中心時

   QPainter painter(this);

    for(int i=0;i<10;i++)
     {
        painter.save();
        painter.rotate(i*10);
        painter.drawText(100,100,"123");
        painter.restore();
    }

 

 

如上圖,可以看到原點位於窗口最左側. ,並且高度等於最右邊位置

  

 

示例2-設置原點中心后:

    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();
}

 

效果:

 

從上圖可以看到旋轉的同時,文字也跟着傾斜了,接下來,我們來自己寫個rotate()函數,不讓文字傾斜

 

示例3-文字不傾斜旋轉

/*  point: 文字所在的點
 *  from_angle : 文字所在的度數
 *  rotate : 需要旋轉的角度,值為-360~360(為負數表示逆時針旋轉,為正數表示順時針旋轉)
 */
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);         //以當前angle度,順時針旋轉36度
       angle -=36;                                  //更新度數,由於順時針,所以用減
    }  
}

 

效果:

 

  

 

示例4-通過選擇加載圖片實現等待效果

以下面圖片為例:

 

代碼如下:

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);
}

 

有了以上知識后,接下來我們就可以制作一個表盤控件了,接下來學習:

32.QT-制作最強電壓電阻表盤,可以自定義陰影效果,顏色,圖標,文字標簽等-附帶demo程序

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM