日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QPainter中坐标系变换问题

發布時間:2025/3/21 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中坐标系变换问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。