Qt——绘图
2024-10-17 09:40:27
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(, ); QPainter p(&pixmap); //填充白色背景色 //p.fillRect(0, 0, 400, 300, QBrush(Qt::white)); pixmap.fill(Qt::white); p.drawPixmap(, , , , QPixmap("../Image/face.png")); //保存图片 pixmap.save("../pixmap.jpg");
//创建一个绘图设备,QImage::Format_ARGB32背景是透明 QImage image(, , QImage::Format_ARGB32); QPainter p; p.begin(&image); //绘图 p.drawImage(, , QImage("../Image/face.png")); //对绘图设备前50个像素点进行操作 ; i < ; i++) { ; j < ; j++) { image.setPixel(QPoint(i, j), qRgb(, , )); //image.pixel(QPoint(i, j)); } } p.end(); image.save("../image.png");
QPicture picture; QPainter p; p.begin(&picture); p.drawPixmap(, , , , QPixmap("../Image/face.png")); p.drawLine(, , , ); p.end(); //保存的是二进制文件 picture.save("../picture.png"); QPicture pic; pic.load("../picture.png"); //加载文件 QPainter p(this); p.drawPicture(, , pic);
QPixmap与QImage的互相转换
QPainter p(this); QPixmap pixmap; pixmap.load("../Image/face.png"); //QPixmap -> QImage QImage tempImage = pixmap.toImage(); p.drawImage(, , tempImage); QImage image; image.load("../Image/face.png"); //QImage -> QPixmap QPixmap tempPixmap = QPixmap::fromImage(image); p.drawPixmap(, , 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(, , 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); } }
最新文章
- Eclipse调试Bug的七种常用技巧
- Centreon 监控报警
- ueditor使用总结——前端篇.md
- convert转化成特定日期格式
- SPRING IN ACTION 第4版笔记-第九章Securing web applications-001-SpringSecurity简介(DelegatingFilterProxy、AbstractSecurityWebApplicationInitializer、WebSecurityConfigurerAdapter、@EnableWebSecurity、@EnableWebMvcS)
- Drools
- database schema
- Oracle DG故障诊断一则:alter database recover to logical standby new_logical_dbname卡住
- 学习CSS记录:CSS文件引入到HTML中
- css3制作网页中常见的小箭头
- Asp.Net Core 程序部署到Linux(centos)生产环境(一):普通部署
- JavaScript中面相对象OOP
- 一起学Hadoop——文件的上传、分发与打包
- fastDFS 命令笔记
- poj1279
- 五、Docker
- Jmeter(十一)_针对响应信息不明确的接口做关联
- PHP mongodb 的使用
- 内置锁(一)synchronized 介绍与用法
- 21个ui设计技巧,让你的设计不落伍