Qt4: QGraphicsScene / View и пользовательский метод преобразования? - PullRequest
2 голосов
/ 11 января 2012

Я знаю, что можно использовать аффинные преобразования с 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(или кто бы ни был ответственен) внутренне использует эти методы, прежде чем он рисует что-то на экране.

Или это не имеет смысла (потому что это создаст проблемы там, где я их не ожидаю, например, при расчете расстояний) илиэто возможно?

Ответы [ 2 ]

0 голосов
/ 24 марта 2016

Хороший подход заключается в инкапсуляции этого преобразования в вашем методе shape () QGraphicsItem. Предположим, у вас есть точка, определенная как пара широты и долготы, она будет хранить пары широт, но ее метод формы будет возвращать спроецированные значения (обычно в пиксельных эквивалентах).

Если вам так хочется, вы можете даже создать подкласс QPoint, чтобы сделать его географически понятным, создавая его с помощью latlon, но предоставляя проекционные значения в его свойствах x, y.

0 голосов
/ 11 января 2012

QGraphicsView использует матрицу QTransform, которая является матрицей 3x3. Поэтому вы можете делать только линейные преобразования. В Qt5 / QtQuick или с QtQuick3d вы можете достичь этого с помощью QML ShaderProgram.

В «чистом» Qt4 вам нужно будет извлечь собственный класс из QGraphicsView, или QAbstractScrollArea, или QGraphicsScene, и переопределить методы рисования.

...