Создание подклассов QGraphicsItem не позволяет мне использовать itemAt () в QGraphicsScene / View - PullRequest
2 голосов
/ 29 января 2012

Я вложил QGraphicsItem в свой собственный класс, Hexagon.Когда я пытаюсь использовать такую ​​функцию, как QGraphicsView::itemAt или QGraphicsScene::itemAt, она не возвращает ни одного из моих Hexagon объектов, потому что вместо этого функция ищет QGraphicsItems.
Как мне сказать, чтобы она выгляделавместо Hexagon объектов?Или мне нужно что-то изменить в моем классе Hexagon?Или даже заново реализовать itemAt()?

В настоящее время я также создаю подкласс QGraphicsView, в частности mousePressedEvent, чтобы получить некоторую информацию об объекте Hexagon, по которому щелкают.

void LatticeView::mousePressEvent(QMouseEvent *event)
{
    Hexagon *hexagon = itemAt(event->pos());
    ...
}

Но когда я пытаюсь скомпилировать, я получаю следующую ошибку:

неправильное преобразование из 'QGraphicsItem *' в 'Hexagon *'

Что я хочудолжен иметь возможность получить объект Hexagon, по которому щелкают, чтобы я мог получить доступ к некоторым переменным, которые я определил в классе Hexagon, которые не являются неявными в классе QGraphicsItem.

1 Ответ

1 голос
/ 29 января 2012

Чтобы заставить это работать, вам нужно привести указатель перед тем, как назначить его переменной указателя другого типа.

Hexagon *hexagon = (Hexagon*)itemAt(event->pos());

Но здесь есть опасность, так как itemAt() может вернуть NULL или элемент не может быть Hexagon.

На самом деле, вы должны использовать приведение стиля C ++ следующим образом:

Hexagon *hexagon = dynamic_cast<Hexagon*>(itemAt(event->pos()));
if (hexagon != NULL)
{
   hexagon->hexagonMethod();
}

Для этого потребуется, чтобы информация о типе времени выполнения была доступна через ваш компилятор.

Существует также функция QGraphicsItem, которая называется type () , которая позволит вам использовать qgraphicsitem_cast(), но для этого потребуется немного больше работы, включая определение enum.

Еще одна вещь, за которой нужно следить. В зависимости от того, как ваша сцена и элементы потребляют события мыши, вы можете не всегда видеть, как вызывается переопределение mousePressEvent(), когда вы этого ожидаете, поскольку событие мыши может никогда не дойти до представления, если оно используется чем-то в сцене .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...