1. 程式人生 > 實用技巧 >Qt 繪圖(QBitmap,QPixmap,QImage,QPicture)

Qt 繪圖(QBitmap,QPixmap,QImage,QPicture)

  • QPainter繪圖繪圖裝置(QPixmap,QImage,QBitmap,QPicture)
    • 重寫繪圖事件,虛擬函式
    • 如果視窗繪圖,必須放在繪圖事件裡實現
    • 繪圖事件內部自動呼叫,視窗需要重繪的時候,狀態改變
    • QPixmap圖片背景透明,針對螢幕進行優化了,和平臺相關,不能對圖片進行修改
    • QImage 和平臺無關,可以對圖片進行修改,線上程中繪圖
    • QPicture 儲存繪圖 的狀態(二進位制檔案)
    • pixmap.save("../pixmap.png"); 儲存圖片
    • setWindowFlags(Qt::FramelessWindowHint | windowFlags());去除邊框
    • setAttribute(Qt::WA_TranslucentBackground);設定透明

QPainter

 1 #ifndef WIDGET_H
 2 #define WIDGET_H
 3  
 4 #include <QWidget>
 5  
 6 namespace Ui {
 7 class Widget;
 8 }
 9  
10 class Widget : public QWidget
11 {
12     Q_OBJECT
13  
14 public:
15     explicit Widget(QWidget *parent = 0);
16     ~Widget();
17 18 protected: 19 void paintEvent(QPaintEvent *event); 20 21 private slots: 22 void on_pushButton_clicked(); 23 24 private: 25 Ui::Widget *ui; 26 int x=0; 27 }; 28 29 #endif // WIDGET_H
 1 #include "widget.h"
 2 #include "ui_widget.h"
 3 #include <QPainter>
 4 #include <QPen>
 5
#include <QBrush> 6 Widget::Widget(QWidget *parent) : 7 QWidget(parent), 8 ui(new Ui::Widget) 9 { 10 ui->setupUi(this); 11 } 12 13 Widget::~Widget() 14 { 15 delete ui; 16 } 17 18 void Widget::paintEvent(QPaintEvent *event) 19 { 20 //QPainter p(this); 21 QPainter p;//建立畫家物件 22 p.begin(this);//指定當前視窗為繪圖裝置 23 //畫背景圖 24 //p.drawPixmap(0,0, width(), height(), QPixmap("../Image/bk.png")); 25 //p.drawPixmap(rect(),QPixmap("../Image/bk.png")); 26 27 //定義畫筆 28 QPen pen; 29 pen.setWidth(5);//設定線寬 30 pen.setColor(QColor(124,123,0));//rgb 31 pen.setStyle(Qt::DashDotDotLine); 32 33 QBrush brush; 34 brush.setColor(Qt::red); 35 brush.setStyle(Qt::Dense1Pattern); 36 37 //p.setPen(pen); 38 p.setBrush(brush); 39 //畫直線 40 p.drawLine(50,50,150,50); 41 p.drawLine(50, 50,50,150 ); 42 43 //畫矩形 44 p.drawRect(x,150,100,50); 45 46 p.drawEllipse(QPoint(150,150),25,50); 47 48 p.drawPixmap(x,180,80,80,QPixmap("../Image/face.png")); 49 50 p.end(); 51 } 52 53 void Widget::on_pushButton_clicked() 54 { 55 x += 20; 56 if(x>width()) 57 { 58 x = 0; 59 } 60 update(); 61 }

QBitmap

 1 #ifndef WIDGET_H
 2 #define WIDGET_H
 3  
 4 #include <QWidget>
 5  
 6 namespace Ui {
 7 class Widget;
 8 }
 9  
10 class Widget : public QWidget
11 {
12     Q_OBJECT
13  
14 public:
15     explicit Widget(QWidget *parent = 0);
16     ~Widget();
17  
18 protected:
19     void paintEvent(QPaintEvent *event);
20  
21 private:
22     Ui::Widget *ui;
23 };
24  
25 #endif // WIDGET_H
 1 #include "widget.h"
 2 #include "ui_widget.h"
 3 #include <QPainter>
 4 #include <QBitmap>
 5 Widget::Widget(QWidget *parent) :
 6     QWidget(parent),
 7     ui(new Ui::Widget)
 8 {
 9     ui->setupUi(this);
10 }
11  
12 Widget::~Widget()
13 {
14     delete ui;
15 }
16  
17 void Widget::paintEvent(QPaintEvent *event)
18 {
19     QPainter p(this);
20     //QPixmap圖片背景透明
21     p.drawPixmap(0,0,QPixmap("../Image/butterfly.png"));
22     //QBitmap
23     p.drawPixmap(200,0, QBitmap("../Image/butterfly.png"));
24     //QPixmap 圖片背景白色
25     QPixmap pixmap;
26     pixmap.load("../Image/butterfly1.png");
27 }

QPixmap

 1 #ifndef WIDGET_H
 2 #define WIDGET_H
 3  
 4 #include <QWidget>
 5  
 6 namespace Ui {
 7 class Widget;
 8 }
 9  
10 class Widget : public QWidget
11 {
12     Q_OBJECT
13  
14 public:
15     explicit Widget(QWidget *parent = 0);
16     ~Widget();
17  
18 private:
19     Ui::Widget *ui;
20 };
21  
22 #endif // WIDGET_H
 1 #include "widget.h"
 2 #include "ui_widget.h"
 3 #include <QPainter>
 4 Widget::Widget(QWidget *parent) :
 5     QWidget(parent),
 6     ui(new Ui::Widget)
 7 {
 8     ui->setupUi(this);
 9     QPixmap pixmap(400, 300);
10     QPainter p(&pixmap);
11     p.fillRect(0,0,400,300,QBrush(Qt::white));
12  
13     pixmap.fill(Qt::white);
14     p.drawPixmap(0,0,80,80,QPixmap("../Image/face.png"));
15  
16     //儲存圖片
17     pixmap.save("../pixmap.png");
18 }
19  
20 Widget::~Widget()
21 {
22     delete ui;
23 }

QImage

 1 #include "widget.h"
 2 #include "ui_widget.h"
 3 #include <QPainter>
 4  
 5 Widget::Widget(QWidget *parent) :
 6     QWidget(parent),
 7     ui(new Ui::Widget)
 8 {
 9     ui->setupUi(this);
10  
11     QImage image(400,300,QImage::Format_ARGB32);
12     QPainter p;
13     p.begin(&image);
14  
15     p.drawLine(50,50,100,100);
16  
17     for(int i=0;i<50;i++)
18     {
19         for(int j=0;j<50;j++)
20         {
21             image.setPixel(QPoint(i,j),qRgb(0,255,0));
22  
23         }
24     }
25     p.end();
26  
27     image.save("../image.png");
28 }
29  
30 Widget::~Widget()
31 {
32     delete ui;
33 }

QPicture

 1 #include "widget.h"
 2 #include "ui_widget.h"
 3 #include <QPainter>
 4 #include <QPicture>
 5 Widget::Widget(QWidget *parent) :
 6     QWidget(parent),
 7     ui(new Ui::Widget)
 8 {
 9     ui->setupUi(this);
10     QPicture picture;
11     QPainter p;
12     p.begin(&picture);
13     p.drawLine(50,50,100,100);
14     p.end();
15  
16     picture.save("../picture.png");
17 }
18  
19 Widget::~Widget()
20 {
21     delete ui;
22 }
23  
24 void Widget::paintEvent(QPaintEvent *event)
25 {
26 //    QPicture pic;
27 //    pic.load("../picture.png");
28     QPainter p(this);
29 //    p.drawPicture(0,0,pic);
30  
31     QPixmap pixmap;
32     pixmap.load("../Image/face.png");
33     QImage tempImage = pixmap.toImage();
34     p.drawImage(0,0, tempImage);
35  
36     QImage image;
37     image.load("../Image/face.png");
38     QPixmap tempPixmap = QPixmap::fromImage(image);
39 }  

視窗透明

 1 #include "widget.h"
 2 #include "ui_widget.h"
 3 #include <QPainter>
 4 #include <QMouseEvent>
 5 #include <QDebug>
 6 Widget::Widget(QWidget *parent) :
 7     QWidget(parent),
 8     ui(new Ui::Widget)
 9 {
10     ui->setupUi(this);
11     setWindowFlags(Qt::FramelessWindowHint | windowFlags());
12  
13     setAttribute(Qt::WA_TranslucentBackground);
14 }
15  
16 Widget::~Widget()
17 {
18     delete ui;
19 }
20  
21 void Widget::paintEvent(QPaintEvent *event)
22 {
23     QPainter p(this);
24     p.drawLine(50,50,100,100);
25 }
26  
27 void Widget::mousePressEvent(QMouseEvent *event)
28 {
29     if(event->button() == Qt::RightButton)
30     {
31      close();
32      qDebug()<<"close";
33     }
34     else if(event->button() == Qt::LeftButton)
35     {
36         p = event->globalPos() - this->frameGeometry().topLeft();
37         qDebug()<<"left";
38     }
39 }
40  
41 void Widget::mouseMoveEvent(QMouseEvent *event)
42 {
43     if(event->button() & Qt::LeftButton)
44     {
45             move(event->globalPos()-p);
46     }
47 }