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 }
原文地址:https://www.cnblogs.com/blog-ccs/p/7453291.html