对 qpainter::scale 的注解

原创 2016年09月03日 09:34:45

qpainter所在的widget有自己的坐标系:X轴向右,Y轴向下。qpainter自己也有坐标系,默认和widget是重合的。但是qpainter的坐标系可以做各种变换,如平移(translate),(scale)。

先说下scale。它的作用是改变qpainter的刻度长度。来看下面代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPaintEvent>
#include <QWheelEvent>
#include <QPainter>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),m_bRect(false)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::paintEvent(QPaintEvent *e)
{
    QPainter qp;
    qp.begin(this);
    
    qp.save();
    
    if(m_bRect)
    {

        qp.scale(2,2);
        
        qp.drawRect(0, 0, 100,100);
    }
    else
    {
        qp.setPen(QColor(255,0,0));

        qp.drawRect(0, 0, 100,100);
    }
    qp.restore();
    qp.end();
}

void MainWindow::wheelEvent(QWheelEvent *e)
{
    int iColor = e->angleDelta().y() + 130;
    qDebug()<<iColor<<"\n";

    m_background = QColor(iColor, iColor, iColor);
    update();
}

void MainWindow::mouseDoubleClickEvent(QMouseEvent *e)
{
    if(Qt::LeftButton == e->button())
    {
        m_bRect = true;
        m_pnt = e->pos();
    }

    update();
}

这部分代码的作用是,在程序刚启动时,在widget的左上角画一个红色正方形,边长100.启动后,假如用户用鼠标在widget上双击一次,程序又会在左上角画一个黑色正方形,边长也是100.但是注意,边长的单位都是以painter坐标系的刻度为单位的。且假如用户双击了widget,在绘制正方形之前,qt会进行如下变换:qp.scale(2,2)。这意味着尽管黑色正方形的边长也是100,但是由于qpainter的刻度已经变为原来2倍(默认qpainter的刻度和widget的刻度一样),所以黑色正方形的边长实际是红色正方形的2倍:


QT 利用QPainter绘图的坐标系转换

Qt绘制图形时,少不了坐标计算,那么如何更好更快地计算出坐标呢?现在来分析一下。        如下图所示,原来坐标系是(0,0)X axis右Y axis下 现在想把它变成,坐标在窗口中间,X右...
  • fanyun_01
  • fanyun_01
  • 2017年01月25日 09:15
  • 2682

QT中用QPainter类所画图像随窗口变化自适应变化

Qpainter类是QT中的一个画图类。该类是用画笔在窗口上直接绘制图像。通常情况下,图像的位置和大小在画图完成后就是定死的了。在实际应用中我们有时需要该图像随着窗口的拖动、最大化等操作下进行自适应变...
  • star_kai
  • star_kai
  • 2017年07月19日 18:02
  • 759

Qt QPainter中坐标系变换问题

一、坐标系简介。 Qt中每一个窗口都有一个坐标系,默认的,窗口左上角为坐标原点,然后水平向右依次增大,水平向左依次减小,垂直向下依次增大,垂直向上依次减小。原点即为(0,0)点,然后以像素为单位...
  • zgrjkflmkyc
  • zgrjkflmkyc
  • 2014年12月01日 18:54
  • 2680

QPainter的使用(画国旗)

国庆比较无聊,然后用Qt的QPainter画了一面国旗,代码如下: 国旗标准尺寸 源码地址//代码不是全部代码,只有主要代码 void MainWindow::paintEvent(QPaintE...
  • zq216991
  • zq216991
  • 2016年10月06日 15:39
  • 632

QPainter类学习

详细描述:QPainter类提供了许多高度优化的函数去做大部分的GUI绘制工作。它可以画从简单的线到复杂的形状。通常情况下,QPainter的使用是在widget当中的painter事件使用。记得在执...
  • madao123
  • madao123
  • 2010年10月13日 15:20
  • 14605

QT 使用QPainter 绘制图形 和 世界变换 world transform

1. 绘制椭圆  饼状型 贝塞尔曲线 绘制图像重写方法 void paintEvent(QPaintEvent *event)即可。 void Widget::paintEvent(QPaintEve...
  • xj626852095
  • xj626852095
  • 2013年08月16日 15:24
  • 1796

Qpainter画图

1.简介Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter、QPaintDevice和QPaintEngine这三个类。QPainter用来执行...
  • wdl20170204
  • wdl20170204
  • 2017年03月29日 17:07
  • 409

Qt实现长图片的放大缩小以及动态显示

这篇文章是在这个基础上进行讨论的谈一谈分别利用opencv、Qt、matlab动态显示图片的实现 其实就是想找一种更加合适的方法进行图片的放大缩小以及动态显示。 这个是效果图 我...
  • baidu_36669549
  • baidu_36669549
  • 2017年12月22日 15:55
  • 309

Qt QWidget实现手势缩放和平移(一)

由于项目要求,需要在QWidget中实现一个手势操作的功能,对图片进行放大/缩小/平移功能,并且还需要支持通过鼠标和键盘来实现该功能。其实这种功能在QGraphicsView中实现比较简单, 不过在Q...
  • luoyayun361
  • luoyayun361
  • 2017年01月13日 15:40
  • 2835

Qt浅谈之窗体缩放(仅增加测试代码)

一、简介         在csdn上看到了一篇窗体动态缩放的文章,觉得很有意思,在作者的代码上加上了测试程序,并把所有代码放在csdn上供下载。程序运行的效果: 二、详解 1、测试代码(完...
  • taiyang1987912
  • taiyang1987912
  • 2016年02月18日 09:18
  • 3553
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对 qpainter::scale 的注解
举报原因:
原因补充:

(最多只允许输入30个字)