【问题标题】:Qt4: QGraphicsScene/View and custom transformation method?Qt4:QGraphicsScene/View 和自定义转换方法?
【发布时间】:2016-03-24 08:08:53
【问题描述】:

我知道可以在 Qt 中使用仿射变换。但是是否也可以设置一个完整的自定义全局变换方法?

用例:在地理坐标中(在 QGraphicsScene/View 的上下文中)绘制投影地理点(纬度、经度)或检索鼠标事件等。

目前我就是这样使用它(一点点伪代码):

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(或负责人)在内部使用这些方法,然后在屏幕上绘制内容。

或者这既不合理(因为它会在我不期望的地方引入问题,例如在计算距离时)也不可能?

【问题讨论】:

    标签: c++ qt qgraphicsview qgraphicsscene


    【解决方案1】:

    QGraphicsView 使用一个 QTransform 矩阵,它是一个 3x3 矩阵。因此,您只能进行线性变换。在 Qt5/QtQuick 或 QtQuick3d 中,您可以使用 QML ShaderProgram 实现此目的。

    在“纯”Qt4 中,您必须从 QGraphicsView、QAbstractScrollArea 或 QGraphicsScene 派生您自己的自定义类并覆盖绘制方法。

    【讨论】:

    • 感谢您的回答!我再次考虑了这个话题,我认为坚持笛卡尔坐标并不是最糟糕的,省去了很多麻烦,我可以像我习惯的那样计算距离和定义向量。或者我深入研究 JOSM 和 Merkaartor 等项目的源代码,看看它们在内部使用了什么。
    【解决方案2】:

    一个好的方法是将这个转换封装在你的 QGraphicsItem shape() 方法中。假设您有一个点定义为一对纬度和经度,它会存储一对纬度,但它的 shape 方法会返回投影值(通常以像素等值表示)。

    如果您愿意,您甚至可以将 QPoint 子类化以使其具有地理感知能力,从而使用 latlon 创建它,但在其 x、y 属性中公开投影值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      相关资源
      最近更新 更多