1. 程式人生 > 實用技巧 >Qt 繪圖事件:QPainter、QPaintEngine和QPaintDevice

Qt 繪圖事件:QPainter、QPaintEngine和QPaintDevice

一、繪圖,重新整理介面的方法

1、繪圖事件

一般在繪圖事件中繪圖

 1 void paintEvent(QPaintEvent *);//繪圖事件在視窗重繪的時候(即狀態改變)的時候呼叫
 2     {
 3         //1、建立畫家物件
 4         QPainter p(this);//指定當前視窗為繪圖裝置
 5 
 6         //2、具體操作
 7         //畫背景圖    /* 不需要新增資原始檔 */
 8         QPixmap("../Image/bk.png"));//引數:頂點座標、長、寬
 9         //p.drawPixmap(rect(), QPixmap("../Image/bk.png"));
//引數:定點座標,寬,高,圖片 10 11 //畫直線 12 #if 0 13 //定義畫筆 用以繪製輪廓線 14 QPen pen; 15 pen.setWidth(5); //設定線寬 16 //pen.setColor(Qt::red); //設定顏色 17 pen.setColor( QColor(14, 9, 234) );//rgb設定顏色 18 pen.setStyle(Qt::DashLine); //設定風格 19 //把畫筆交給畫家 20 p.setPen(pen);
21 #endif 22 p.drawLine(50,50,150,50);//起點和終點座標 23 24 //畫矩形 25 p.drawRect(50,50,150,150); 26 27 //畫圓 28 p.drawEllipse(QPint(50,50),50,25);//引數:圓心 水平方向半徑 垂直方向半徑 29 #if 0//畫刷 用以用來填充 30 QBrush brush; //建立畫刷物件 31 brush.setColor(Qt::red); //
設定顏色 32 brush.setStyle(Qt::Dense1Pattern);//設定樣式 33 p.setBrush(brush);//把畫刷交給畫家 34 #endif 35 }

2、手動重新整理

update();//庫函式update,間接呼叫paintEvent

二、QBitmap和QPixmap
  QBitmap只有黑白2種顏色,而QPixmap彩色繪圖
  當不需要彩色的時候,可以使用QBitmap;因為QBitmap耗費資源少。

1 //QPixmap和QBitmap的使用方法基本相同
2 QPainter p(this);
3 p.drawPixmap(0,0, QPixmap("../image.png"));
4 p.drawPixmap(200,0, QBitmap("../image.png"));//引數3    彩色圖片顯示的也是黑白

三、常用的繪圖裝置

  一般情況,QPixmap用於顯示;QImage用於傳輸;
1、QPixmap:針對螢幕進行優化,和平臺相關,不能對圖片進行修改(畫素點)

1 QPixmap pixmap(400,300);//直接指定繪圖裝置的大小400*300
2 QPainter p(&pixmap);    //畫家
3 #if 0
4 //填充背景
5     p.fillRect(0,0,400,300, QBrush(Qt::white));
6     pixmap.fill(Qt::white);
7 #endif
8 p.drawPixmap(0,0,80,80, QPixmap("../image/face.png"));
9 pixmap.save("../pixmap.jpg);    //儲存畫家畫的圖片

2、QImage:和平臺相關,可以對圖片進行修改,可以線上程中繪圖

 1 QImage image(400, 300, QImage::Format_ARGB32);//QImage::Format_ARGB32背景是透明
 2 QPainter p(&image);
 3 //繪圖
 4 p.drawImage(0, 0, QImage("../Image/face.png"));//drawPixmap()也行
 5 //對繪圖裝置前50個畫素點進行操作
 6 for(int i = 0; i < 50; i++)
 7 {
 8     for(int j = 0; j < 50; j++)
 9     {
10         image.setPixel(QPoint(i, j), qRgb(0, 255, 0));
11     }
12 }
13 image.save("../image.png");

3、QPicture:儲存繪圖的狀態(二進位制檔案)

1 QPicture picture;
2 QPainter p(&picture);
3 p.drawPixmap(0,0,80,80, QPixmap("../image/face.png"));
4 picture.save("../picture");//儲存的是二進位制檔案
5 #if 0//載入QPicture圖片
6   QPicture pic;
7   pic.load("../picture");
8 #endif

4、QPixmap與QImage的轉換
//QImage用於傳輸、QPixmap用於顯示

 1 QPainter p(this);
 2 QPixmap pixmap;
 3 pixmap.load("../Image/face.png");
 4 //QPixmap -> QImage
 5 QImage tempImage = pixmap.toImage();
 6 p.drawImage(0, 0, tempImage);
 7 
 8 QImage image;
 9 image.load("../Image/face.png");
10 //QImage -> QPixmap
11 QPixmap tempPixmap = QPixmap::fromImage(image);
12 p.drawPixmap(100, 0, tempPixmap);