(十一)QPainter绘图, QPixmap,QImage,QPicture,QBitmap
#include "widget.h" #include "ui_widget.h" #include <QPainter> #include <QFont> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { x = 20; ui->setupUi(this); connect(ui->move, &QPushButton::clicked, this, [=]() { // 刷新窗口 update(); // 系统调用paintEvent 函数 }); } Widget::~Widget() { delete ui; } void Widget::paintEvent(QPaintEvent *) { // 创建画家类对象 QPainter p(this); // 指定绘图设备 #if 0 // 创建新画笔 -- 轮廓 QPen pen; pen.setColor(/*Qt::green*/QColor(0, 255, 0)); pen.setWidth(10); // 像素 pen.setStyle(Qt::DotLine); // 闭合区域使用画刷 QBrush brush(QPixmap(":/Image/face.png")); p.setBrush(brush); // 将新画笔设置给画家类 p.setPen(pen); // 画背景图 p.drawPixmap(0, 0, QPixmap(":/Image/xks.png")); // 画直线 p.drawLine(QPoint(100, 100), QPoint(300, 500)); // 画椭圆 p.drawEllipse(QPoint(200, 200), 100, 50); // 画矩形 p.drawRect(400, 200, 200, 200); // 写字 QFont font("华文彩云", 48, 75, true); p.setFont(font); p.drawText(100, 400, "我是中国人, 我爱我的祖国!!!"); int width = this->width(); int heght = this->height(); #endif // 提供笑脸 x += 5; if(x > this->width()) { x = 20; } p.drawPixmap(x, 100, QPixmap(":/Image/sunny.png")); }
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); protected: /* * 1. 回调函数 * 2. 此函数不需要用户与调用, 再刷新的时候会自定调用 * 1. 窗口显示的时候 * 2. 最大化, 最小化 * 3. 窗口被这遮挡, 重新显示的时候 * 4. 用户强制刷新的时候 * 5. ........... * 3. 如果想使用画家类在窗口中画图, 操作必须在paintEvent函数中完成 */ void paintEvent(QPaintEvent *); private: Ui::Widget *ui; int x; }; #endif // WIDGET_H
QPixmap,QImage,QPicture
#include "widget.h" #include "ui_widget.h" #include <QPainter> #include <QPicture> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); // 在QPixmap中画图 QPixmap pix(300, 300); // 纸的大小 pix.fill(Qt::red); QPainter p(&pix); p.setPen(QPen(Qt::green, 10)); p.drawRect(10, 10, 280, 280); p.drawEllipse(150, 150, 50, 50); pix.save("D:\\mypixmap.png"); // 指定绘图设备 1. 构造函数中(参数是绘图设备) // 2. begin(参数是绘图设备) // end(); // 在QImage中画图 QImage img(300, 300, QImage::Format_RGB32); // 纸的大小 img.fill(Qt::red); p.begin(&img); p.setPen(QPen(Qt::green, 10)); p.drawRect(10, 10, 280, 280); p.drawEllipse(150, 150, 50, 50); p.end(); img.save("D:\\myImage.png"); // 在QPicture中画图 // 1. 保存的是绘图步骤 -- 画家类 // 2. 不是图片, 二进制文件(save保存生成的文件) // 3. 不依赖平台 QPicture pic; // 纸的大小 p.begin(&pic); p.setPen(QPen(Qt::green, 10)); p.drawRect(10, 10, 280, 280); p.drawEllipse(150, 150, 50, 50); p.end(); pic.save("D:\\mypic.aaa"); } // QWidget // QPixmap QImage QPicture QBitmap(黑白图片) // QBitmap 父类 QPixmap // QPixmap -- 图片类, 主要用来显示, 它针对于显示器显示做了特殊优化, 依赖于平台的, 只能在主线程中使用(UI线程) // QIamge -- 图片类 , 不依赖有平台, (图片传输 , 可以在多线程中对其进行操作) Widget::~Widget() { delete ui; } void Widget::paintEvent(QPaintEvent *) { QPainter p(this); QPicture pic; pic.load("D:\\mypic.png"); p.drawPicture(100, 100, pic); }
QPixmap: p.load("路径");———加载图片 p.drawPixmap(b); a.专门为图像在屏幕上的显示做了优化,依赖于平台 b.主要应用于平台上的图形显示,在不同的平台上拥有相同是显示效果 QBitmap b;-- p.drawPixmap(b) 是QPixmap的一个子类,只显示黑白色 QImage a.使用独立于硬件的绘制系统,专门为图像的像素级访问做了优化 b.可以在多线程中使用 c.可以修改图片中的任意一个像素值 QPicture -- 二进制文件 a.记录和重现QPainter 的各种命令 b.与平台无关 QPixmap 和 QImage 的直接相互转换 1.QPixmap-->QImage:QPixmap::toImage() 2.QImage-->QPixmap:QPixmap::fromImage() [static]