QT学习笔记(10) 绘图
一、简单绘图
包括画背景图、简单图形、手动更新窗口、06_QBitmap和QPixmap的区别
代码如下:
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 //重写绘图事件,虚函数 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代码
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 }
二、绘图设备
QPixmap:针对屏幕进行优化,和平台相关
QImage:和平台无关,可以对图片进行修改,在线程中绘图
QPicture:保存绘图的状态,保存为二进制文件
代码如下:
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 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 }
三、不规则窗口
在绘制不规则窗口时,首先去窗口边框,把窗口背景色设置为透明。然后在写移动位置、关闭等方法。
代码如下:
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 }