日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Qt坐標繪圖

系統(tǒng) 2350 0
1.坐標系簡介

Qt中每一個窗口都有自己的一個坐標系,默認窗口左上角為坐標原點(0,0),然后水平向右依次增大(X軸),垂直向下依次增大(Y軸)。例如:

void MyDraw::paintEvent( QPaintEvent * )

{

QPainterpaint( this );

paint.setBrush(Qt::green );

paint.drawRect(0, 0, 100, 100 );

paint.setBrush(Qt::red );

paint.drawRect(-50, -50, 100, 100 );

}

上例中,先在原點(0,0)繪制了一個長、寬都是100像素的綠色矩形,然后在點(-50,-50)繪制了一個同樣大小(長、寬均為100像素)的紅色矩形,只能看到紅色矩形的一部分。

效果圖如下:

Qt坐標繪圖

這是因為在點(-50,-50)繪制的長、寬各100圖形的其它3/4均被窗體遮擋了。

2.坐標系變換。

坐標系變換是利用變換矩陣來進行的,我們可以利用QTransform類來設置變換矩陣,因為一般我們不需要進行更改,所以這里不在涉及。下面我們只是對坐標系的平移,縮放,旋轉(zhuǎn),扭曲等應用進行介紹。

2.1利用translate()函數(shù)進行平移變換。

void MyDraw::paintEvent( QPaintEvent * )

{

QPainterpaint( this );

paint.setBrush(Qt::green );

paint.drawRect(0, 0, 100, 100 );

paint.translate(100, 100 ); //坐標變換,重新把點(100,100)作為原點

paint.setBrush(Qt::red );

paint.drawRect(0, 0, 100, 100 );

paint.translate(-100, -100 ); //坐標變換,移動(-100,-100)恢復至原點(0,0)

paint.drawLine(0, 0, 50, 50 );

}

效果圖如下:

Qt坐標繪圖

這里將(100,100)點作為了原點,所以此時(100,100)就是(0,0)點,以前的(0,0)點就是(-100,-100)點。要想使原來的(0,0)點重新成為原點,就是將(-100,-100)設為原點。

2.2利用scale()函數(shù)進行比例變換,實現(xiàn)縮放效果。

void MyDraw::paintEvent( QPaintEvent * )

{

QPainterpaint( this );

paint.setBrush(Qt::green );

paint.drawRect(0, 0, 100, 100 );

paint.scale( 2, 2); //paint放大兩倍

paint.setBrush(Qt::red );

paint.drawRect(50, 50, 50, 50 );

paint.scale( 0.5,0.5 ); // paint縮小一半(恢復原來)

paint.setBrush(Qt::yellow );

paint.drawEllipse(0, 0, 100, 100 );

}

效果圖如下:

Qt坐標繪圖

可以看到,painter.scale(2,2),是將橫縱坐標都擴大了兩倍,現(xiàn)在的(50,50)點就相當于以前的(100,100)點。

2.3利用shear()函數(shù)就行扭曲變換。

void MyDraw::paintEvent( QPaintEvent * )

{

QPainterpaint( this );

paint.setBrush(Qt::green );

paint.drawRect(0, 0, 100, 100 );

paint.shear( 0, 1 ); //縱向扭曲1倍

paint.setBrush(Qt::red );

paint.drawRect(0, 100, 100, 100 );

paint.shear( 0, -1); //恢復原狀

paint.setBrush(Qt::yellow );

paint.drawEllipse(0, 0, 100, 100 );

}

效果圖如下:

Qt坐標繪圖

這里,painter.shear(0,1),是對縱向進行扭曲,0表示不扭曲,當將第一個0更改時就會對橫行進行扭曲,關(guān)于扭曲變換到底是什么效果,你觀察一下是很容易發(fā)現(xiàn)的。

2.4利用rotate()函數(shù)進行比例變換,實現(xiàn)縮放效果。

void MyDraw::paintEvent( QPaintEvent * )

{

QPainterpaint( this );

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

paint.rotate( 30); //順時針旋轉(zhuǎn)30度

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

paint.translate(100, 100 ); //坐標變換,原點(0,0)移至(100,100)點

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

paint.rotate( 30); //順時針旋轉(zhuǎn)30度

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

}

效果圖如下:

Qt坐標繪圖

因為默認的rotate()函數(shù)是以原點為中心進行順時針旋轉(zhuǎn)的,所以我們要想使其以其他點為中心進行旋轉(zhuǎn),就要先進行原點的變換。這里的painter.translate(100,100)將(100,100)設置為新的原點,想讓直線以其為中心進行旋轉(zhuǎn),可是你已經(jīng)發(fā)現(xiàn)效果并非如此。是什么原因呢?我們添加一條語句,如下:

void MyDraw::paintEvent( QPaintEvent * )

{

QPainterpaint( this );

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

paint.rotate(30 ); //順時針旋轉(zhuǎn)30度

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

paint.rotate( -30 );

paint.translate(100, 100 ); //坐標變換,原點(0,0)移至(100,100)點

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

paint.rotate(30 ); //順時針旋轉(zhuǎn)30度

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

}

效果圖如下:

Qt坐標繪圖

這時就是我們想要的效果了。我們加的一句代碼為painter.rotate(-30),這是因為前面已經(jīng)將坐標旋轉(zhuǎn)了30度,我們需要將其再旋轉(zhuǎn)回去,才能是以前正常的坐標系統(tǒng)。不光這個函數(shù)如此,這里介紹的這幾個函數(shù)均如此,所以很容易出錯。下面我們將利用兩個函數(shù)來很好的解決這個問題。

3.坐標系狀態(tài)的保護。

我們可以先利用save()函數(shù)來保存坐標系現(xiàn)在的狀態(tài),然后進行變換操作,操作完之后,再用restore()函數(shù)將以前的坐標系狀態(tài)恢復,其實就是一個入棧和出棧的操作。

例如:

void MyDraw::paintEvent( QPaintEvent * )

{

QPainterpaint( this );

paint.save(); //保存坐標狀態(tài)

paint.translate(100, 100 );

paint.setBrush(Qt::green );

paint.drawRect(0, 0, 100, 100 );

paint.drawLine(0, 0, 50, 50 );

paint.restore(); //恢復坐標狀態(tài)

paint.setBrush(Qt::red );

paint.drawRect(0, 0, 100, 100 );

paint.drawLine(0, 0, 50, 50 );

}

效果圖如下:

Qt坐標繪圖

利用好這兩個函數(shù),可以實現(xiàn)快速的坐標系切換,繪制出不同的圖形。

源代碼如下:


Qt坐標繪圖


更多文章、技術(shù)交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 浠水县| 隆子县| 浦北县| 陇南市| 虞城县| 色达县| 金沙县| 四会市| 万州区| 周宁县| 武陟县| 汪清县| 施秉县| 彩票| 金溪县| 杂多县| 胶州市| 紫阳县| 海盐县| 乐都县| 和硕县| 德兴市| 台州市| 彭州市| 苍溪县| 万宁市| 两当县| 南华县| 西乌| 大城县| 兰溪市| 策勒县| 成安县| 前郭尔| 虞城县| 灯塔市| 二连浩特市| 泸西县| 绥棱县| 景谷| 建宁县|