QPainter中坐标系变换问题
一、坐標系簡介。
Qt中每一個窗口都有一個坐標系,默認的,窗口左上角為坐標原點,然后水平向右依次增大,水平向左依次減小,垂直向下依次增大,垂直向上依次減小。原點即為(0,0)點,然后以像素為單位增減。
例如:
void Dialog::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);
}
二、坐標系變換。
坐標系變換是利用變換矩陣來進行的,我們可以利用QTransform類來設置變換矩陣,因為一般我們不需要進行更改,所以這里不在涉及。下面我們只是對坐標系的平移,縮放,旋轉,扭曲等應用進行介紹。
1.利用translate()函數進行平移變換。
void Dialog::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);
}
這里將(100,100)點作為了原點,所以此時(100,100)就是(0,0)點,以前的(0,0)點就是
(-100,-100)點。要想使原來的(0,0)點重新成為原點,就是將(-100,-100)設為原點。
2.利用scale()函數進行比例變換,實現縮放效果。
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);
}
效果如下。
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);
}
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);
}
三、坐標系狀態的保護。
我們可以先利用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);
}
效果如下。
總結
以上是生活随笔為你收集整理的QPainter中坐标系变换问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AB1601开机运行后死机
- 下一篇: Qt贴图最简单程序