zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    1046 Shortest Distance (20 分)(模拟)
    1004. Counting Leaves (30)PAT甲级真题(bfs,dfs,树的遍历,层序遍历)
    1041 Be Unique (20 分)(hash散列)
    1036 Boys vs Girls (25 分)(查找元素)
    1035 Password (20 分)(字符串处理)
    1044 Shopping in Mars (25 分)(二分查找)
    onenote使用小Tip总结^_^(不断更新中...)
    1048 Find Coins (25 分)(hash)
    三个故事
    领导者的举止
  • 原文地址:https://www.cnblogs.com/blog-ccs/p/7453291.html
Copyright © 2011-2022 走看看