Qt 2D绘图 下载本文

void Dialog::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); }

效果如下。

可以看到,painter.scale(2,2),是将横纵坐标都扩大了两倍,现在的(50,50)点就相当于以前的 (100,100)点。

3.利用shear()函数就行扭曲变换。 void Dialog::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更改时就会对横行进行扭曲,关于扭曲变换到底是什么效果,你观察一下是很容易发现的。

4.利用rotate()函数进行比例变换,实现缩放效果。 void Dialog::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)设置为新的原点,想让直线以其为中心进行旋转,可是你已经发现效果并非如此。是什么原因呢?我们添加一条语句,如下:

void Dialog::paintEvent(QPaintEvent *) {

QPainter painter(this);

painter.drawLine(0,0,100,0);

painter.rotate(30); //以原点为中心,顺时针旋转30度 painter.drawLine(0,0,100,0); painter.rotate(-30); painter.translate(100,100); painter.rotate(30);

painter.drawLine(0,0,100,0); }

效果如下。

这时就是我们想要的效果了。我们加的一句代码为painter.rotate(-30),这是因为前面已经将坐标旋转了30度,我们需要将其再旋转回去,才能是以前正常的坐标系统。不光这个函数如此,这里介绍的这几个函数均如此,所以很容易出错。下面我们将利用两个函数来很好的解决这个问题。 三、坐标系状态的保护。

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

void Dialog::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); }

效果如下。

利用好这两个函数,可以实现快速的坐标系切换,绘制出不同的图形。 接着上面一节,前面只是很简单的讲解了一下Qt坐标系统的概念,通过对几个函数的应用,我们应该已经对Qt的坐标系统有了一个模糊的认识。那么现在就来让我们更深入地研究一下Qt窗口的坐标。希望大家把这一节的例子亲手做一下,不要被我所说的东西搞晕了! 我们还是在以前的工程中进行操作。 获得坐标信息:

为了更清楚地获得坐标信息,我们这里利用鼠标事件,让鼠标点击左键时输出该点的坐标信息。

1.在工程中的dialog.h文件中添加代码。 添加头文件: #include

在public中添加函数声明:void mousePressEvent(QMouseEvent *); 然后到dialog.cpp文件中: 添加头文件: #include 定义函数:

void Dialog::mousePressEvent(QMouseEvent *event) {

qDebug() << event->pos(); }