QT學習筆記(10) 繪圖

1、簡單繪圖less

包括畫背景圖、簡單圖形、手動更新窗口、06_QBitmap和QPixmap的區別函數

代碼以下:優化

mainwindow.h代碼ui

 1 #ifndef MAINWINDOW_H
 2 #define MAINWINDOW_H
 3 
 4 #include <QMainWindow>
 5 
 6 namespace Ui {
 7 class MainWindow;
 8 }
 9 
10 class MainWindow : public QMainWindow
11 {
12     Q_OBJECT
13 
14 public:
15     explicit MainWindow(QWidget *parent = 0);
16     ~MainWindow();
17 
18 protected:
19     //重寫繪圖事件,虛函數
20     //若是在窗口繪圖,必須放在繪圖事件實現
21     //繪圖事件內部自動調用,窗口須要重繪的時候(狀態改變)
22     void paintEvent(QPaintEvent *event);
23 
24 private slots:
25     void on_pushButton_clicked();
26 
27 private:
28     Ui::MainWindow *ui;
29     int x;
30 };
31 
32 #endif // MAINWINDOW_H

mainwindow.cpp代碼this

  1 #include "mainwindow.h"
  2 #include "ui_mainwindow.h"
  3 #include <QPainter>
  4 #include <QPen>
  5 #include <QColor>
  6 #include <QBrush>
  7 #include <QBitmap>
  8 
  9 MainWindow::MainWindow(QWidget *parent) :
 10     QMainWindow(parent),
 11     ui(new Ui::MainWindow)
 12 {
 13     ui->setupUi(this);
 14 }
 15 
 16 MainWindow::~MainWindow()
 17 {
 18     delete ui;
 19 }
 20 
 21 void MainWindow::paintEvent(QPaintEvent *event)
 22 {
 23 
 24     //QPainter p(this);
 25     QPainter p;//建立畫家對象
 26     p.begin(this);//指定當前窗口爲繪圖設備
 27 
 28     //繪圖操做
 29     //先畫背景,再畫其餘東西,防止被覆蓋
 30     p.drawPixmap(0,0,width(),height(),QPixmap("../bk.jpg"));//繪製背景圖片
 31     //p.drawPixmap(rect(),QPixmap("../bk.jpg"));
 32 
 33 
 34     //QPixmap和QBitmap的區別:
 35     //QPixmap能繪製各類顏色
 36     //QBitmap只繪製黑白兩種顏色
 37     p.drawPixmap(0,0,100,100,QPixmap("../bk.jpg"));
 38     p.drawPixmap(0,150,100,100,QBitmap("../bk.jpg"));
 39 
 40     QPixmap pixmap;
 41     pixmap.load("../bk.jpg");
 42     p.drawPixmap(150,0,100,100,pixmap);
 43 
 44     QBitmap bitmap;
 45     bitmap.load("../bk.jpg");
 46     p.drawPixmap(150,150,100,100,bitmap);
 47 
 48 
 49     //定義畫筆
 50     QPen pen;
 51     pen.setWidth(5);
 52     pen.setColor( QColor(14,9,234) );//rgb設置顏色
 53     pen.setStyle(Qt::SolidLine);
 54 
 55     //建立畫刷對象
 56     QBrush brush;
 57     brush.setColor(Qt::red);//設置顏色
 58     brush.setStyle(Qt::Dense5Pattern);//設置樣式
 59 
 60 
 61     //把畫筆交給畫家
 62     p.setPen(pen);
 63     //把畫刷交給畫家
 64     p.setBrush(brush);
 65 
 66     //畫直線
 67     p.drawLine(50,50,150,50);
 68     p.drawLine(50,50,50,150);
 69 
 70     //畫矩形
 71     p.drawRect(150,150,100,50);
 72 
 73     //畫圓
 74     p.drawEllipse(QPoint(150,150),50,25);
 75 
 76     //畫圖片,而後點擊按鈕移動
 77     p.drawPixmap(x,300,80,80,QPixmap("../bk.jpg"));
 78 
 79     p.end();
 80 
 81 
 82     //繪圖設備:
 83     //QPixmap:針對屏幕進行優化,和平臺相關
 84     //QImage:和平臺無關,能夠對圖片進行修改,在線程中繪圖
 85     //QPicture:保存繪圖的狀態,保存爲二進制文件
 86 }
 87 
 88 void MainWindow::on_pushButton_clicked()
 89 {
 90 
 91     x+=20;
 92     if(x>width())
 93     {
 94         x=0;
 95     }
 96 
 97     //刷新窗口,讓窗口重繪,整個窗口都刷新
 98     update();//間接調用paintEvent()
 99     //update()不能直接放到paintEvent()中,防止遞歸,
100 }

 

2、繪圖設備spa

  QPixmap:針對屏幕進行優化,和平臺相關
  QImage:和平臺無關,能夠對圖片進行修改,在線程中繪圖
  QPicture:保存繪圖的狀態,保存爲二進制文件線程

代碼以下:code

mainwindow.h代碼orm

 1 #ifndef MAINWINDOW_H
 2 #define MAINWINDOW_H
 3 
 4 #include <QMainWindow>
 5 
 6 namespace Ui {
 7 class MainWindow;
 8 }
 9 
10 class MainWindow : public QMainWindow
11 {
12     Q_OBJECT
13 
14 public:
15     explicit MainWindow(QWidget *parent = 0);
16     ~MainWindow();
17 protected:
18     void paintEvent(QPaintEvent *event);
19 
20 private:
21     Ui::MainWindow *ui;
22 };
23 
24 #endif // MAINWINDOW_H

mainwindow.cpp對象

 1 #include "mainwindow.h"
 2 #include "ui_mainwindow.h"
 3 #include <QPainter>
 4 #include <QPicture>
 5 
 6 MainWindow::MainWindow(QWidget *parent) :
 7     QMainWindow(parent),
 8     ui(new Ui::MainWindow)
 9 {
10 
11     ui->setupUi(this);
12 
13 
14     //繪圖設備:
15     //QPixmap:針對屏幕進行優化,和平臺相關
16     //QImage:和平臺無關,能夠對圖片進行修改,在線程中繪圖
17     //QPicture:保存繪圖的狀態,保存爲二進制文件
18 
19 
20 
21     /*
22     //繪圖設備,400*300
23     QPixmap pixmap(400,300);
24     //在繪圖設備上繪圖
25     QPainter p(&pixmap);
26     //填充白色背景色
27     p.fillRect(0,0,400,300,QBrush(Qt::white));
28     pixmap.fill(Qt::white);
29     p.drawPixmap(0,0,80,80,QPixmap("../bk.jpg"));//繪製的圖片在設備上
30     //須要將設備上的保存成圖片
31     pixmap.save("../pixmap.jpg");
32     */
33 
34     /*
35     //建立一個繪圖設備,QImage::Format_ARGB32背景是透明
36     QImage image(400,300,QImage::Format_ARGB32);
37     QPainter p;
38     p.begin(&image);
39     //繪圖
40     p.drawImage(0,0,QImage("../bk.jpg"));
41     //對繪圖設備前50個像素點進行操做
42     for(int i=0;i<50;i++)
43     {
44         for(int j=0;j<50;j++)
45         {
46             image.setPixel(QPoint(i,j),qRgb(0,255,0));
47         }
48     }
49     p.end();
50     image.save("../image.png");
51     */
52 
53     QPicture picture;
54     QPainter p;
55     p.begin(&picture);
56     //繪圖
57     p.drawPixmap(0,0,80,80,QPixmap("../bk.jpg"));
58     p.drawLine(50,50,150,50);
59     p.end();
60     //保存的是二進制文件
61     picture.save("../picture.png");
62 
63 
64 }
65 
66 MainWindow::~MainWindow()
67 {
68     delete ui;
69 }
70 
71 void MainWindow::paintEvent(QPaintEvent *event)
72 {
73 
74     //QPixmap 和 QImage的相互轉化
75     QPainter p(this);
76     QPixmap pixmap;
77     pixmap.load("../bk.jpg");
78     //QPixmap -> QImage
79     QImage tempImage = pixmap.toImage();
80     p.drawImage(0,0,tempImage);
81 
82     QImage image;
83     image.load("../bk.jpg");
84     //QImage -> QPixmap
85     QPixmap tempPixmap = QPixmap::fromImage(image);
86     p.drawPixmap(150,0,tempPixmap);
87 
88 
89 
90 }

 

 3、不規則窗口

在繪製不規則窗口時,首先去窗口邊框,把窗口背景色設置爲透明。而後在寫移動位置、關閉等方法。

代碼以下:

mainwindow.h

 1 #ifndef MAINWINDOW_H
 2 #define MAINWINDOW_H
 3 
 4 #include <QMainWindow>
 5 
 6 namespace Ui {
 7 class MainWindow;
 8 }
 9 
10 class MainWindow : public QMainWindow
11 {
12     Q_OBJECT
13 
14 public:
15     explicit MainWindow(QWidget *parent = 0);
16     ~MainWindow();
17 
18 protected:
19     void paintEvent(QPaintEvent *event);
20     void mouseMoveEvent(QMouseEvent *event);
21     void mousePressEvent(QMouseEvent *event);
22 
23 private:
24     Ui::MainWindow *ui;
25 
26     QPoint point;
27 };
28 
29 #endif // MAINWINDOW_H

mainwindow.cpp

 1 #include "mainwindow.h"
 2 #include "ui_mainwindow.h"
 3 #include <QPainter>
 4 #include <QMouseEvent>
 5 
 6 MainWindow::MainWindow(QWidget *parent) :
 7     QMainWindow(parent),
 8     ui(new Ui::MainWindow)
 9 {
10     ui->setupUi(this);
11 
12     //去窗口邊框
13     setWindowFlags(Qt::FramelessWindowHint | windowFlags());
14     //把窗口背景設置爲透明
15     setAttribute(Qt::WA_TranslucentBackground);
16 
17 }
18 
19 MainWindow::~MainWindow()
20 {
21     delete ui;
22 }
23 void MainWindow::paintEvent(QPaintEvent *event)
24 {
25     //不規則窗口
26     QPainter p(this);//在窗口中繪製圖片
27     p.drawPixmap(0,0,QPixmap("../1.jpg"));
28 
29 }
30 void MainWindow::mousePressEvent(QMouseEvent *event)
31 {
32     if(event->button() == Qt::RightButton)
33     {
34         //若是是右鍵
35         close();
36     }
37     else if(event->button() == Qt::LeftButton)
38     {
39         //求座標差值
40         //當前點擊座標-窗口左上角座標
41         point = event->globalPos() - this->frameGeometry().topLeft();//窗口矩形的左上角的點
42     }
43 }
44 void MainWindow::mouseMoveEvent(QMouseEvent *event)
45 {
46     if(event->buttons() & Qt::LeftButton)
47     {
48         //移動窗口,獲得左上角的座標
49         move(event->globalPos() - point);
50     }
51 }
相關文章
相關標籤/搜索