QT -- QPainter介紹


介紹

  • 可以在QPaintDevice類上繪制各種圖形

  • QPaintDevice類表示QPainter的繪圖設備(畫布)

  • QpaintDevice子類有QImage、QOpenGLPaintDevice、QWidget 等

  • 所以, QPainter可以在QImage、QOpenGLPaintDevice、QWidget上進行繪制圖形

  • QPainter只能在類對象的paintEvent()函數中繪制圖形

QPainter類的成員角色有:

  • QPen : 用於繪制幾何圖形的邊緣,由顏色,寬度,線風格等參數組成

  • QBrush : 用於填充幾何圖形的調色板,由顏色和填充風格組成

  • QFont : 用於文本繪制

  • QPixmap : 繪制圖片,可以加速顯示,帶有屏幕截圖,窗口截圖等支持,適合小圖片

  • QImage : 繪制圖片,可以直接讀取圖像文件進行像素訪問,適合大圖片

  • QBitmap : QPixmap的一個子類,主要用於顯示單色位圖

  • QPicture : 繪圖裝置,用於記錄和重播Qpainter的繪圖指令

具體參考: https://blog.csdn.net/cloud_castle/article/details/26256663

QPainter基礎圖形繪制相關函數:

繪畫圓弧drawArc:

QPainter painter(this);

painter.setPen(    QPen(QColor(11,67,127),3));

QRectF rect(40.0, 40.0, 100.0, 100.0);

painter.setRenderHint(QPainter:: Antialiasing, true);  //設置渲染,啟動反鋸齒

painter.drawArc(rect,30*16,150*16); //繪畫角度為30°~(30+150°)

painter.drawPoint(40+50,40+50);     //繪制中心點

繪畫橢圓drawElipse:

QPainter painter(this);

painter.setRenderHint(QPainter:: Antialiasing, true);  //設置渲染,啟動反鋸齒

painter.setPen( QPen(QColor(11,67,127),3));

painter.drawEllipse(40.0, 40.0, 100.0, 100.0);   //半徑為50的圓

繪畫扇形drawPie:

QPainter painter(this);

painter.setPen(QPen(QColor(11,67,127),3));

QRectF rect(40.0, 40.0, 100.0, 100.0);

painter.setRenderHint(QPainter:: Antialiasing, true);  //設置渲染,啟動反鋸齒

painter.drawPie(rect,30*16,150*16); //繪畫角度為30°~(30+150°)

繪畫弦drawChord:

QPainter painter(this);

painter.setPen(QPen(QColor(11,67,127),3));

QRectF rect(40.0, 40.0, 100.0, 100.0);

painter.setRenderHint(QPainter:: Antialiasing, true);  //設置渲染,啟動反鋸齒

painter.drawChord(rect,30*16,150*16);       //繪畫角度為30°~(30+150°)

QPainter-視口/窗口:

在Qt中, QPainter可以通過視口和窗口來設置自身組件大小位置.

**視口: ** 基於QPaintDevice類組件的坐標實現的,屬於物理坐標,通過setViewport成員函數設置

**窗口: ** 基於自身的邏輯坐標實現的,並不是真實坐標,可以通過setWindow成員函數設置

需要注意的是:

Qpainter的坐標是使用的窗口坐標(邏輯坐標)

當QPainter初始化時,視口和窗口坐標默認是相同的,也就是說原點(0,0)在於窗口左上角

所以視口和窗口的最小坐標和最大坐標是從左上到右下的.

示例1-設置原點(0,0)為窗口的(100,100),設置繪畫區域為窗口大小為100*100

如下圖所示,其中藍色為視口坐標,紅色為窗口坐標:

由於數學Y坐標方向與屏幕Y坐標方向是相反的,所以w保持不變,h = -height

所以對應代碼為:

QPainter painter(this);

QSize ViewWH(100,100);        //定義視口寬高

painter.setViewport(50,50,ViewWH.width(),ViewWH.height());

painter.setWindow(-50,50,ViewWH.width(),-ViewWH.height());

painter.setBrush(QColor(187,229,253));

painter.setPen(QPen(QColor(11,67,127),2));   

painter.drawRect(-50,50,ViewWH.width(),-ViewWH.height()); //窗口背景

painter.drawLine(-50,0,50,0);       //畫X坐標

painter.drawLine(0,-50,0,50);           //畫Y坐標

效果如下:

示例2-在窗口的中心處繪制正弦波:

QPainter painter(this);

painter.setViewport(50,50,width()-100,height()-100);    //設置視口為中心處

painter.setWindow(-10,4,20,-8);
                //定義窗口 左上角為(-10,4) 右下角為(10,-4)

painter.fillRect(-10,4,20,-8,Qt::black);

painter.setPen(QPen(QBrush(Qt::green),1/(width()-100)/20));
          //由於當前窗口和視口的比例為 width()-100 : 20
          //所以1px的橫縱Line線寬 = 1/(width()-100)/20

painter.drawLine(-10,0,10,0);

painter.setPen(QPen(QBrush(Qt::green),1/(height()-100)/8));

painter.drawLine(0,-4,0,4);

for(float x=-10;x<10;x+=0.01)
{
        float y= qSin(x);
        painter.drawPoint(QPointF(x,y));
        qDebug()<<x <<","<<y;
}

效果如下:

Qpainter通過drawText來繪制文本:

繪制文本時,是以左下角為原點開始的.

可以通過QfontMetrics獲取字符串在指定字體下的寬度和高度.

示例:

void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QFont font;
font.setPixelSize(24); //設置字體像素大小為12
QString text="1234567"; //設置顯示的文本
QFontMetrics metrics(font);
int w=metrics.width(text); //獲取顯示文本的寬度
int h=metrics.height(); //獲取顯示文本的高度
painter.setFont(font);
painter.setPen(Qt::blue);
painter.drawText(QRect(width()/2-w,height()/2-h,w,h),text);
painter.drawRect(QRect(width()/2-w,height()/2-h,w,h));
qDebug()<<"w:"<<w; //一個字符大小為12*24,所以寬度為12*7
qDebug()<<"h:"<<h; //高度為24
}

效果:

未完,下章學習:30.QT-漸變之QLinearGradient、 QConicalGradient、QRadialGradient
https://www.cnblogs.com/lifexy/p/9238878.html

https://www.cnblogs.com/lifexy/p/9203929.html


免責聲明!

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



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