2012-01-11 45 views
2

我知道這是可能使用仿射變換使用Qt。但是,是否也可以設置完整的自定義全局轉換方法?Qt4:QGraphicsScene/View和自定義轉換方法?

用例:繪製投影的地理點(緯度,經度)或檢索地理corrdinates鼠標事件等(在QGraphicsScene /視圖的上下文中)。

在我使用這樣的(有點僞代碼)的那一刻:

MyPoint pt = myProjection(geographicPoint); 
QPoint(pt.x, pt.y); 

// or, to make it shorter, but essentially it's the same 
QPoint p = myProjection(geoPoint); 

geoPoint = myBackProjection(mouseEvent.getPoint()); 

而且我喜歡做的地方「登記」我的轉化方法,使的QGraphicsView(或誰負責)內部使用這些方法之前,它在屏幕上繪製的東西。

抑或既不意義(因爲它會帶來問題,我並不指望他們,如在計算距離)也不是可能的嗎?

回答

0

的QGraphicsView使用QTransform矩陣,這是一個3×3矩陣。因此你只能做線性變換。在Qt5/QtQuick或QtQuick3d中,您可以通過QML ShaderProgram實現此功能。

在「純粹的」Qt4中,您必須從QGraphicsView或QAbstractScrollArea或QGraphicsScene派生自己的自定義類並重寫paint方法。

+0

謝謝您的回答!我再次考慮了這個話題,而且我的笛卡爾座標不是最差的,可以節省很多麻煩,我可以計算距離並定義像我以前那樣的向量。或者我深入JOSM和Merkaartor等項目的源代碼,並看看他們在內部使用什麼。 – 2012-01-11 11:59:41

0

一個好方法是將此轉換封裝在QGraphicsItem shape()方法中。假設有定義爲一對緯度和經度的一個點,它將存儲對緯度經度的,但它的形狀的方法將返回投影值(在象素當量通常)。

如果你覺得這樣,你甚至可以繼承QPoint使其具有地理意義,因此使用latlon創建它,但是在x,y屬性中暴露投影值。