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 }