Проблемы с масштабом реального мира с QGraphicsView / QGraphicsItem

У меня проблемы с масштабированием - я подозреваю, что что-то упускаю ... возможно, кто-то меня поправит.

Я использую QGraphicsScene и QGraphicsView для отображения положения лодки с использованием широты и долготы в десятичных градусах. Для непосвященных позиции выглядят так:

LON: -71.34253 LAT: 41.549886

Это позиции, которые я устанавливаю для своих пользовательских объектов QGraphicsItem. Это координаты «реального мира».

Моя проблема в том, что мне кажется, что мои объекты не отображаются должным образом, и я подозреваю, что не понимаю масштаб, который я должен использовать, когда рисую в своей функции paint ().

Я использую Qt через PyQt, но это должно быть так же, не так ли? Вот мой собственный класс, который представляет позицию.

class myGraphicsFix(QGraphicsItem):

    def __init__(self):
            super().__init__()

            self.lat = 0.0
            self.lon = 0.0

            self.boatlength = 1.5696e-6 # assuming 6371 km earth diameter, 10 m boat length

    def setLatLon(self, tlat, tlon):
            self.lat = tlat
            self.lon = tlon
            self.setPos(self.lat, self.lon)

    def paint(self, painter, option, widget):
            pen = QPen(Qt.SolidLine)
            pen.setColor(Qt.black)
            pen.setWidth(0.0)
            painter.drawPoint(QPointF(0.0,0.0))

    def boundingRect(self):
            return QRectF(-self.boatlength/2.0,-self.boatlength/2.0, +self.boatlength/2.0, self.boatlength)

Когда этот код запускается, все, что я получаю, - это сплошной черный блок, что означает, что мои точки каким-то образом нарисованы как гигантские квадраты. Если я заменю drawPoint на drawEllipse () следующим образом:

painter.drawEllipse(-self.boatlength/2.0,-self.boatlength/2.0, self.boatlength, self.boatlength)

Вообще ничего не рисуется ... Есть мысли?

Том.


person Tom D.    schedule 02.08.2016    source источник
comment
В первом случае вы создаете перо с шириной линии 0 и не используете его. Как вы что-то получаете? Во втором случае вы рисуете эллипс очень маленького радиуса с большим центром координат. Как вы пытаетесь его найти?   -  person ilotXXI    schedule 02.08.2016
comment
Спасибо ilotXXI. Перо в моем первом случае было пережитком кода drawEllipse. Вы правы, что код drawEllipse странный - я изменил его на 0,0 и половину длины лодки для радиусов X и Y, но я все равно получаю то же самое. Мой вопрос действительно в том, что я должен использовать для радиуса? Координаты реального мира?   -  person Tom D.    schedule 02.08.2016


Ответы (1)


Рад ответить на свой вопрос ...

Да, масштаб, который будет использоваться в QGraphicsItem, - это масштаб «реального мира».

Проблема, с которой я столкнулся, заключалась в том, что я неправильно вызывал функцию drawEllipse. Вот исправленный код, который работает. Обратите внимание на объект QPointF () в аргументе.

    def paint(self, painter, option, widget):
            pen = QPen()
            pen.setWidth(0)
            painter.setPen(pen)
            painter.drawEllipse(QPointF(0.0,0.0), +self.boatlength/2.0, self.boatlength/2.0)

Обратите внимание, что в методе __init__() у меня есть self.boatlength = 0.00001, который соответствует лодке в "реальных" единицах (здесь десятичные градусы на поверхности земли).

Теперь все работает как шарм.

person Tom D.    schedule 02.08.2016