#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]