Qt之图形(转换)
简述
QTransform类指定坐标系的2D转换,可以指定平移、缩放、扭曲(剪切)、旋转或投影坐标系。绘制图形时,通常会使用。
QTransform与QMatrix的不同之处在于,它是一个真正的3x3矩阵,允许视角转换,QTransform的 toAffine()方法允许将QTransform转换到QMatrix。如果视角转换已在矩阵指定,则转换将导致数据丢失。
常用接口
函数 | 描述 |
---|---|
translate(qreal dx, qreal dy) | 平移-对坐标系沿着x轴移动dx、沿y轴移动dy |
scale(qreal sx, qreal sy) | 缩放-通过水平的sx和垂直的sy缩放坐标系 |
rotate(qreal angle, Qt::Axis axis = Qt::ZAxis) | 旋转-对指定的轴用给定的角度反时针旋转坐标系统 |
shear(qreal sh, qreal sv) | 扭曲-通过水平的sh和垂直的sv扭曲坐标系 |
reset() | 重置为单位矩阵 |
正常
我们先来看正常情况下的效果。
效果
源码
这里,我们绘制了一张从坐标原点开始,长度、宽度均为150的图片。
void MainWindow::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
// 反走样
painter.setRenderHint(QPainter::Antialiasing, true);
painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));
}
平移
效果
源码
void MainWindow::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
// 反走样
painter.setRenderHint(QPainter::Antialiasing, true);
QTransform transform;
// 平移
transform.translate(120, 20);
painter.setTransform(transform);
painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));
}
translate()可以将坐标原点变更为指定的x、y坐标。这里,将坐标原点由(0, 0)变为(120, 20)。
旋转
效果
Qt::XAxis | Qt::YAxis | Qt::ZAxis |
---|---|---|
源码
void MainWindow::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
// 反走样
painter.setRenderHint(QPainter::Antialiasing, true);
QTransform transform;
// 平移
transform.translate(120, 20);
// 旋转
transform.rotate(45, Qt::XAxis);
painter.setTransform(transform);
painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));
}
rotate()使用角度技巧表示远近。设置第二个参数为角度的常量值后,可以使用X轴、Y轴、Z轴技巧。它默认是以原点为中心进行旋转的,如果要改变旋转的中心,可以使用translate()函数完成。
缩放
效果
源码
void MainWindow::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
// 反走样
painter.setRenderHint(QPainter::Antialiasing, true);
QTransform transform;
// 平移
transform.translate(120, 20);
// 旋转
transform.rotate(45);
// 缩放
transform.scale(0.5, 0.5);
painter.setTransform(transform);
painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));
}
scale()可以进行缩放。这里,使绘制的图像缩小到原来的一半。
扭曲
效果
源码
void MainWindow::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
// 反走样
painter.setRenderHint(QPainter::Antialiasing, true);
QTransform transform;
// 横向扭曲
transform.shear(0.5, 0);
painter.setTransform(transform);
painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));
}
shear()可以实现图片的扭曲。它有两个参数,前面的参数实现横向变形,后面的参数实现纵向变形。当它们的值为0时,表示不扭曲。
Qt之图形(转换)的更多相关文章
- QT 基本图形绘制
QT 基本图形绘制 1.告诉绘制引擎一些东西 QPainter::Antialiasing 在可能的情况下,反锯齿 QPainter::TextAntialiasing 在可能的情况下,文 ...
- Qt之图形视图框架
简述 图形视图(Graphics View)提供了一个平台,用于大量自定义2D图元的管理与交互,并提供了一个视图部件(view widget)来显示可以缩放和旋转的图元. 框架包括一个事件传播架构,支 ...
- Qt之图形(QPainterPath)
简述 QPainterPath 类(绘图路径)提供了一个容器,用于绘图操作,可以创建和重用图形形状. 绘图路径是由许多图形化的构建块组成的对象,例如:矩形.椭圆.直线和曲线.构建块可以加入在封闭的子路 ...
- Qt之图形(绘制文本)
简述 前面我们讲解了Qt图形的基本绘制,其中包括: 绘制文本.直线.直线.矩形.弧线.椭圆.多边形.图片,以及其它一些高级用法,比如:渐变.转换等. 本节我们来详细讲解文字的绘制.主要通过QPaint ...
- 使用Qt 开发图形界面的软件
3DSlicer, a free open source software for visualization and medical image computing AcetoneISO:镜像文件挂 ...
- 使用Qt 开发图形界面的软件(尘中远)
3DSlicer, a free open source software for visualization and medical image computing AcetoneISO:镜像文件挂 ...
- QT 12 QTimage转换Mat
QImage cvMat2QImage(const cv::Mat& mat) { // 8-bits unsigned, NO. OF CHANNELS = 1 if(mat.type() ...
- Qt之图形(组合)
简述 使用QPainter绘制图形或者图像时,在重叠区域使用组合模式(Composition_mode).在绘图设备上通过组合模式使用QImage时,必须使用Format_ARGB32_Premult ...
- Qt之图形(简笔画-绘制卡通蚂蚁)
简述 关于简笔画的介绍很多,有动物.水果.蔬菜.交通工具等,通常会对绘制一步步进行拆分.组合.然后绘制为我们想要的结果. 下面来介绍另外的一个种类:昆虫类-卡通蚂蚁. 简述 绘制 效果 源码 绘制 效 ...
随机推荐
- activity(工作流)初步学习记录
1.概念 工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现某个预期 ...
- SpringMVC-注解映射器和适配器_20190323
1 注解映射器和适配器 1.1 注解映射器spring3.1之前默认加载映射器是org.springframework.web.servlet.mvc.annotation.DefaultAnnota ...
- C++12.1.4 类的前向声明、不完全类型类
只声明却没有定义的类称为—————–不完全类型,不完全类型不能定义该类型的对象,只能用于定义指向该类型的指针及引用,或者用于声明(不是定义)使用该类型作为形参类型或返回类型的函数. 在创建类的对象之前 ...
- (转)JVM内存管理-----堆内存
来源:http://blog.csdn.net/yu422560654/article/details/7952613 Heap堆内存理解 一个JVM实例只有一个堆内存,堆内存的大小是可以调节的.类加 ...
- 洛谷P2766 最长不下降子序列问题 网络流_DP
Code: #include<cstdio> #include<iostream> #include<vector> #include<algorithm&g ...
- 当relative遇上z-index,阻断事件捕获
今天在调试前端页面的时候,发现addflowrank这个元素的click事件不能触发了.下图是它的元素结构. 用开发者工具试图定位这个元素,看看它到底怎么了.发现:无论我怎么用光标定位这个元素都定位不 ...
- dede内链怎么优化,Dedecms内部链接优化技巧
dede内链怎么优化,dedecms内部链接优化技巧 使用dedecms的过程中发现,可以通过dedecms的文档关键词维护功能.发表文章时候的关键词添加功能(也可以自动获取)以及核心设置里面的是否使 ...
- Java设置Client Socket链接Server超时时间
Java设置Client Socket链接Server超时时间 学习了:http://blog.csdn.net/tterminator/article/details/52494141 http:/ ...
- Android基础笔记(十三)- 内容提供者原理和简单使用
为什么要有内容提供者 内容提供者的工作原理 使用内容解析者对内容提供者进行增删改查操作 利用内容提供者和内容解析者备份手机短信 利用内容提供者插入短信 为什么要有内容提供者 内容提供者技术的目的是: ...
- HDOJ 题目1520 Anniversary party(树形dp)
Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...