• 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 }
  • 相关阅读:
    第五周课后作业
    第五周读书笔记
    PB16120853+JL17110067
    第一次个人作业报告
    《编程匠艺》读书笔记----第四周
    软工第一次个人作业博客(一)
    软工第一次个人作业博客(二)
    《程序员修炼之道》读书笔记(二)--第三周
    关于在aspx前台使用后台变量的问题
    sql语句优化SQL Server
  • 原文地址:https://www.cnblogs.com/blog-ccs/p/7453291.html
Copyright © 2020-2023  润新知