1.涉及类
QPainter QPaintEngine QPaintDevice
作为绘图的使用者,只需要关注 QPainter 和 QPaintDevice
2.QPainter
使用 QPainter 进行绘图
常用API
setPen, setBrush, setDevice
Pen, Brush : 又有 setColor 、setStyle
3. QDevice
通过与 QDevice 的继承关系知道能在哪里绘图。
常见 绘图设备
QPixmap : 对屏幕显示进行优化,与平台相关
QBitmap : 继承与QPixmap,只有黑白两色,省资源。
QImage :与平台无关,能进行图片修改,能线程绘图
QPicture:二进制文件保存绘图状态。
//绘图设备, 400*300 QPixmap pixmap(400, 300); QPainter p(&pixmap); //填充白色背景色 //p.fillRect(0, 0, 400, 300, QBrush(Qt::white)); pixmap.fill(Qt::white); p.drawPixmap(0, 0, 80, 80, QPixmap("../Image/face.png")); //保存图片 pixmap.save("../pixmap.jpg");
//创建一个绘图设备,QImage::Format_ARGB32背景是透明 QImage image(400, 300, QImage::Format_ARGB32); QPainter p; p.begin(&image); //绘图 p.drawImage(0, 0, QImage("../Image/face.png")); //对绘图设备前50个像素点进行操作 for(int i = 0; i < 50; i++) { for(int j = 0; j < 50; j++) { image.setPixel(QPoint(i, j), qRgb(0, 255, 0)); //image.pixel(QPoint(i, j)); } } p.end(); image.save("../image.png");
QPicture picture; QPainter p; p.begin(&picture); p.drawPixmap(0, 0, 80, 80, QPixmap("../Image/face.png")); p.drawLine(50, 50, 150, 50); p.end(); //保存的是二进制文件 picture.save("../picture.png"); QPicture pic; pic.load("../picture.png"); //加载文件 QPainter p(this); p.drawPicture(0, 0, pic);
QPixmap与QImage的互相转换
QPainter p(this); QPixmap pixmap; pixmap.load("../Image/face.png"); //QPixmap -> QImage QImage tempImage = pixmap.toImage(); p.drawImage(0, 0, tempImage); QImage image; image.load("../Image/face.png"); //QImage -> QPixmap QPixmap tempPixmap = QPixmap::fromImage(image); p.drawPixmap(100, 0, tempPixmap);
4.绘制无边框图片
重要API:
设置无边框
setWindowFlags
setAttribute
globalPos
frameGeometry
#include "widget.h" #include "ui_widget.h" #include <QPainter> #include <QMouseEvent> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); //去窗口表框 setWindowFlags(Qt::FramelessWindowHint | windowFlags()); //把窗口背景设置为透明 setAttribute(Qt::WA_TranslucentBackground); } Widget::~Widget() { delete ui; } void Widget::paintEvent(QPaintEvent *) { QPainter p(this); p.drawPixmap(0, 0, QPixmap("../Image/sunny.png")); } void Widget::mousePressEvent(QMouseEvent *e) { if(e->button() == Qt::RightButton) { //如果是右键 close(); } else if(e->button() == Qt::LeftButton) { //求坐标差值 //当前点击坐标-窗口左上角坐标 p = e->globalPos() - this->frameGeometry().topLeft(); } } void Widget::mouseMoveEvent(QMouseEvent *e) { if(e->buttons() & Qt::LeftButton) { move(e->globalPos() - p); } }