Qt的繪圖系統(畫家,繪圖工具,繪圖設備)


在這裏插入圖片描述

繪圖概念

圖系統基於QPainter,QPainterDevice和QPaintEngine三個類
QPainter(畫家) 使用QPaintEngine(繪圖工具)在QPainterDevice(繪圖設備)上畫畫。
在這裏插入圖片描述
注意:
1、如果在主窗口上繪畫 必須在繪圖事件(paintEvent)中完成畫畫.
2、繪圖事件 調用的時機(1、窗口加載 2、update())
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
widget.h的類中:
在這裏插入圖片描述
widget.cpp
在這裏插入圖片描述

案例:畫一個背景圖(畫家的方法)

QPainter畫家的方法:
在這裏插入圖片描述
在這裏插入圖片描述
在widget.cpp的繪圖事件中:

//重寫繪圖事件  主窗口加載的時候 調用
void Widget::paintEvent(QPaintEvent *event)
{
    //定義一個畫家 畫圖片
    QPainter *painter = new QPainter(this);

    //定義一個圖片控件
    QPixmap pix;
    pix.load(":/image/Sunny.jpg");
    //修改圖片大小(和窗口一樣大)
    pix.scaled(this->width(),this->height());

    //畫家在主窗口繪畫
    painter->drawPixmap(0,0,this->width(),this->height(), pix);
}

運行結果:
在這裏插入圖片描述

案例:通過update()重新加載繪圖事件

ui文件:
在這裏插入圖片描述
widget.h文件聲明 畫圖時間函數
在這裏插入圖片描述
widget.cpp的構造函數中 讓按鈕動起來
在這裏插入圖片描述
widget.cpp的paintEvent繪圖事件:

//重寫繪圖事件
void Widget::paintEvent(QPaintEvent *event)
{
    static int x = 0;
    //定義一個畫家
    QPainter *painter = new QPainter(this);
    //定義一個圖片控件
    QPixmap pix;
    pix.load(":/image/sunny.png");
    pix.scaled( pix.width()*0.5, pix.height()*0.5);

    //畫家繪圖
    //drawPixmap前兩個參數是起點座標

    painter->drawPixmap(x,0, pix.width(), pix.height(),pix);
    x+=2;
    if(x >= this->width())
    {
        x = 0;
    }
}

2、畫家的其他繪製函數

1、劃線drawLine

在這裏插入圖片描述

//劃線
    painter->drawLine(0,0,200,200);

2、畫矩形

在這裏插入圖片描述
//畫家對 畫筆進行設置
在這裏插入圖片描述
//設置畫筆顏色
在這裏插入圖片描述
在這裏插入圖片描述
設置樣式:
在這裏插入圖片描述
在這裏插入圖片描述

//畫矩形
    //畫家對 畫筆進行設置
    //painter->setPen(Qt::DotLine);//樣式
    painter->setPen(Qt::red);//顏色 紅色
    painter->drawRect(50,50,100,100);

運行結果:
在這裏插入圖片描述

3、畫圓

在這裏插入圖片描述

//畫圓
    painter->drawEllipse(150,150,200,200);
    //畫橢圓
    painter->drawEllipse(200,400,200,100);

運行結果:
在這裏插入圖片描述

3、繪圖設備

在這裏插入圖片描述

案例1:QBitmap

在widget.cpp的構造函數中:
在這裏插入圖片描述
運行結果:
在這裏插入圖片描述

案例2:image的像素操作

在QImage類中:
在這裏插入圖片描述
在widget.cpp的構造函數中:

#if 1
    //定義QIamge一個繪圖設備
    QImage img;
    img.load(":/image/up.png");//事先添加資源

    for(int i=50;i<100;i++)
    {
        for(int j=50;j<100;j++)
        {
            int value= qRgb(255,0,0);
            img.setPixel(i,j,  value);
        }
    }

    //定義一個畫家
    QPainter painter(&img);
    painter.drawEllipse(QPoint(30,30),30,30);
    //保存圖片
    img.save("C:\\work\\qt\\day21\\02_test\\imge02.jpg");
#endif

運行結果:
在這裏插入圖片描述
在這裏插入圖片描述

案例:重現繪圖指令QPicture

在widget.cpp的構造函數中(保存繪圖指令)

#if 1
    //繪圖設備
    QPicture picture;
    //畫家
    QPainter painter;
    
    //記錄繪圖指令
    painter.begin(&picture);
    painter.drawEllipse(100,100,100,100);
    //結束記錄繪圖指令
    painter.end();
    
    //保存繪圖指令
    picture.save("C:\\work\\qt\\day21\\02_test\\pic.zl");
    
#endif

運行結果:
在這裏插入圖片描述
重現pic.zl 到主窗口中(繪圖事件中完成)
在widget.cpp的繪圖事件中寫

#if 1
    QPicture picture;
    QPainter painter(this);
    //繪圖設備picture 加載繪圖指令
    picture.load("C:\\work\\qt\\day21\\02_test\\pic.zl");

    //畫家根據 繪圖指令繪圖
    painter.drawPicture(100,100, picture);
#endif

運行結果:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章