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
運行結果: