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时,表示不扭曲。

时间: 2024-07-31 06:46:33

Qt之图形(转换)的相关文章

Q4Wine 0.999-rc7发布 Qt 4 图形用户界面

Q4Wine 是一款用于 Wine 应用的Qt 4 http://www.aliyun.com/zixun/aggregation/18378.html">图形用户界面,帮助您管理Wine前缀和安装的应用程序.它可以将Qt颜色主题导出到Wine的颜色设置,支持同一时间的不同Wine版本,支持自动启动的图标,可以从PE文件中提取图标. Q4Wine 0.999-rc7该版本进行一些错误的修复. 软件信息:http://q4wine.brezblock.org.ua/ 下载地址:http://

Qt之图形(QPainterPath)

简述 QPainterPath类提供了一个容器,用于绘图操作,可以创建和重用图形形状. QPainterPath是一个图形构建块的对象,如矩形.椭圆.直线和曲线.构建块可以加入在封闭的子路径中,例如:矩形或椭圆形.一个封闭的路径同时存在开始点和结束点.或者作为未封闭的子路径独立存在,如:直线和曲线. QPainterPath可以进行填充.显示轮廓和裁剪.要生成可填充的轮廓的绘图路径,可以使用QPainterPathStroker类.QPainterPath比正常绘制的主要优点在于:复杂的图形只需

Qt之图形视图框架

简述 图形视图(Graphics View)提供了一个平台,用于大量自定义2D图元的管理与交互,并提供了一个视图部件(view widget)来显示可以缩放和旋转的图元. 框架包括一个事件传播架构,支持场景(Scene)中的图元(Item)进行精确的双精度交互功能.图元可以处理键盘事件.鼠标按下.移动.释放和双击事件,同时也能跟踪鼠标移动. 图形视图使用一个BSP(Binary Space Partitioning - 二叉空间分割)树,以提供对图形元素的快速查找,正因为如此,它可以使超大的场景

Qt之图形(绘制文本)

简述 前面讲解了 Qt 图形的基本绘制,包括: 直线.弧线.矩形.椭圆.图片.多边形,以及其它一些高级用法,比如:渐变.转换等. 本节主要分享文本的绘制.主要通过 QPainter 的 darwText() 函数来实现,里面包含多个重载函数,其中,可以通过 QRect 来指定绘制的区域,也可以通过 QPoint 来指定绘制的起始点. QFont 类可以辅助设置文本的大小.粗细.字符间距等,然后使用 setFont() 来设置. QFontInfo 类用来获取字体的信息,可以通过 fontInfo

Qt之图形(QPainter的基本绘图)

简述 Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice和QPaintEngine这三个类. QPainter用来执行绘图操作,其提供的API在GUI或QImage.QOpenGLPaintDevice.QWidget和QPaintDevice显示图形(线.形状.渐变等).文本和图像. QPaintDevice不直接绘制物理显示画面,而利用逻辑界面的中间媒介.例如,绘制矩形图形时,为了将对象绘制到QWidget.Q

Qt之图形(绘制漂亮的圆弧)

简述 综合前面对二维绘图的介绍,想必我们对一些基本绘图有了深入的了解,下面我们来实现一些漂亮的图形绘制. 简述 圆形 效果 源码 弧形 效果 源码 文本 效果 源码 旋转 效果 源码 圆形 经常地,我们会在网上看到一些列的抽奖活动,里面就有圆盘抽奖,是不是有点手痒了O(∩_∩)O~ 效果 源码 void MainWindow::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setRenderHint(QPainter::A

Qt之图形(简笔画-绘制卡通蚂蚁)

简述 关于简笔画的介绍很多,有动物.水果.蔬菜.交通工具等,通常会对绘制一步步进行拆分.组合.然后绘制为我们想要的结果. 下面来介绍另外的一个种类:昆虫类-卡通蚂蚁. 简述 绘制 效果 源码 绘制 效果 具体的效果如下所示,我们可以再进行更好的完善. 源码 主要分为以下三部: 绘制屁股 绘制肚子 绘制头部 注意:绘制的时候,由于各个部分的颜色不同,而且坐标不好定位,所以我们采用的图形覆盖的方式. void MainWindow::paintEvent(QPaintEvent *) { QPain

Qt之图形(组合)

简述 使用QPainter绘制图形或者图像时,在重叠区域使用组合模式(Composition_mode).在绘图设备上通过组合模式使用QImage时,必须使用Format_ARGB32_Premultiplied和Format_ARGB32格式之一. 简述 效果 源码 更多参考 效果 源码 ... painter.drawImage(0, 0, destinationImage); painter.setCompositionMode(QPainter::CompositionMode_Dest

Qt之图形(简笔画-绘制漂亮的西瓜)

简述 Summer is coming-我们呢,为大家准备了丰盛的佳果-西瓜,清爽解渴,甘味多汁. 一笔一划学简笔画,分分钟让你掌握一门新技能,下面我们来绘制一个"盛夏之王"-西瓜,赶快一起来试试吧. 简述 简笔画 绘制 效果 源码 简笔画 我们先简单看看西瓜的基本组成,一步步进行拆分.组合. 绘制 效果 具体的效果如下所示,我们可以再进行更好的完善. 源码 主要分为以下三部: 绘制外圆(绿色部分) 绘制内圆(红色部分) 绘制椭圆(西瓜子) 注意:绘制西瓜子的时候,由于西瓜子随机分布在