• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    5年前 (2013-12-26)  QT |   1 条评论  23 
    文章评分 0 次,平均分 0.0

    函数接口

    translate()函数,进行平移变换;scale()函数,进行比例变换;rotate()函数,进行旋转变换;shear()函数,进行扭曲变换。
    函数save()和restore(),利用它们来保存和弹出坐标系的状态,从而实现快速利用几个变换来绘图

    坐标系简介

    Qt中每一个窗口都有一个坐标系,默认的,窗口左上角为坐标原点,然后水平向右依次增大,水平向左依次减小,垂直向下依次增大,垂直向上依次减小。原点即为(0,0)点,然后以像素为单位增减。 如下的代码简单演示了这段话。

    void MainWindow::paintEvent(QPaintEvent *) {
        QPainter painter(this);
        painter.setBrush(Qt::red);
        painter.drawRect(0,0,100,100);
        painter.setBrush(Qt::yellow);
        painter.drawRect(-50,-50,100,100);
    }

    先在原点(0,0)绘制了一个长宽都是100像素的红色矩形,又在(-50,-50)点绘制了一个同样大小的黄色矩形。可以看到,我们只能看到黄色矩形的一部分。效果如下图。
    QT-2D坐标变换系统

    坐标系变换

    坐标系变换是利用变换矩阵来进行的,我们可以利用QTransform类来设置变换矩阵,因为一般我们不需要进行更改,所以这里不在涉及。下面我们只是对坐标系的平移,缩放,旋转,扭曲等应用进行介绍。

    1.translate()平移

    void MainWindow::paintEvent(QPaintEvent *) {
        QPainter painter(this);
        painter.setBrush(Qt::yellow);
        painter.drawRect(0,0,50,50);
        painter.translate(100,100); //将点(100,100)设为原点
        painter.setBrush(Qt::red);
        painter.drawRect(0,0,50,50); //在新坐标系下画矩形
        painter.translate(-100,-100);//平移原点到原来位置
        painter.drawLine(0,0,20,20); //在原来坐标系下划线
    }

    先画一矩形,再平移原点并作为新坐标系,然后画一矩形,再平移原点到旧的坐标系并划线。
    QT-2D坐标变换系统

    2.利用scale()函数进行比例变换,实现缩放效果

    void MainWindow::paintEvent(QPaintEvent *) {
        QPainter painter(this);
        painter.setBrush(Qt::yellow);
        painter.drawRect(0,0,100,100);
        painter.scale(2,2); //放大两倍
        painter.setBrush(Qt::red);
        painter.drawRect(50,50,50,50);
    }

    QT-2D坐标变换系统
    我们将横纵坐标都扩大2倍,然后运行程序,查看效果:我们点击矩形右下顶点,是(100,100),比以前的(50,50)扩大了2倍。

    3.利用shear()函数就行扭曲变换

    void MainWindow::paintEvent(QPaintEvent *) {
        QPainter painter(this);
        painter.setBrush(Qt::yellow);
        painter.drawRect(0,0,50,50);
        painter.shear(0,1); //纵向扭曲变形
        painter.setBrush(Qt::red);
        painter.drawRect(50,0,50,50);
    }

    结果如下,painter.shear(0,1),是对纵向进行扭曲,0表示不扭曲,当将第一个0更改时就会对横行进行扭曲,关于扭曲变换到底是什么效果,你观察一下是很容易发现的。
    QT-2D坐标变换系统
    这里,painter.shear(0,1),是对纵向进行扭曲,0表示不扭曲,当将第一个0更改时就会对横行进行扭曲,关于扭曲变换到底是什么效果,你观察一下是很容易发现的。

    4.rotate()函数进行比例变换,实现缩放效果

    void MainWindow::paintEvent(QPaintEvent *) {
        QPainter painter(this);
        painter.drawLine(0,0,100,0);
        painter.rotate(30); //以原点为中心,顺时针旋转30度
        painter.drawLine(0,0,100,0);
        painter.translate(100,100);
        painter.rotate(30);
        painter.drawLine(0,0,100,0);
    }

    因为默认的rotate()函数是以原点为中心进行顺时针旋转的,所以我们要想使其以其他点为中心进行旋转,就要先进行原点的变换。这里的painter.translate(100,100)将(100,100)设置为新的原点.
    QT-2D坐标变换系统
    如图所示两条直线并不平行,假设我们想要的是画两条平行的线段,原来来 painter.rotate(30)将坐标轴已经旋转,可以 painter.rotate(-30)来补偿先前的旋转。

    坐标系状态的保护

    我们可以先利用save()函数来保存坐标系现在的状态,然后进行变换操作,操作完之后,再用restore()函数将以前的坐标系状态恢复,其实就是一个入栈和出栈的操作。

    void MainWindow::paintEvent(QPaintEvent *) {
        QPainter painter(this);
        painter.save(); //保存坐标系状态
        painter.translate(100,100);
        painter.drawLine(0,0,50,50);
        painter.restore(); //恢复以前的坐标系状态
        painter.drawLine(0,0,50,50);
    }

    这样就画出两条平行的直线。

     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/2875.html

    关于

    发表评论

    暂无评论

    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享