Вы должны быть в состоянии использовать dynamic_cast
, но Qt также предоставляет свой собственный приведение qgraphicsitem_cast
, которое возвращает элемент, приведенный к данному типу, если элемент относится к этому типу или иным образом 0.
Примечание из документа:
Чтобы эта функция работала правильно с пользовательскими элементами, переопределите функцию type () для каждого пользовательского подкласса QGraphicsItem.
blockquote>Пример класса:
class MyQGraphicsPixmapItem : public QGraphicsPixmapItem { public: ... enum { Type = UserType + 1 }; int type() const override { return Type; } ... };
Пример теста:
MyQGraphicsPixmapItem myItem; qDebug() << &myItem; QGraphicsItem *item = &myItem; MyQGraphicsPixmapItem *castedItem = qgraphicsitem_cast
(item); if (castedItem) { qDebug() << castedItem; } else { qWarning() << "casting failed"; } Обновление:
QGraphicsScene: : itemAt возвращает самый верхний видимый элемент в указанной позиции или 0, если в этой позиции нет элементов.
Если вы подтвердили с помощью
qgraphicsitem_cast
, что вы успешно произвели приведение, то есть он вернул указатель, а не 0, то вы действительно получили свой пользовательский элемент, а не какой-либо другой графический элемент. Тогда в нем должно быть определено имя, а не пустая строка, если вы определили имя для всех ваших пользовательских элементов.Для дальнейшей отладки этой проблемы вы можете использовать QGraphicsScene :: items , чтобы вывести список всех элементов на сцене, которые считаются видимыми
QGraphicsScene::itemAt
. Выполните приведение в цикле и распечатайте имя всех ваших пользовательских предметов.Одна вещь, которая приходит мне в голову, это то, что это связано с координатами, которые вы используете при вызове itemAt. Вы, например, выполняете приведение, когда вы щелкаете мышью, а затем запрашиваете сцену с координатами элемента , а не с координатами сцены . QGraphicsSceneMouseEvent :: scenePos возвращает положение курсора мыши в координатах сцены. Может быть, вы не получаете заказной предмет, как вы думаете?
Библиотека HotKey, доступная в LivePipe, управляет работами пакета с Прототипом и является совместимым IE.
JimmyP отправил это как комментарий, но он имеет право быть ответом для голосования целей.
То, что я сделал бы, присоединить onKeyUp события к document.body. Затем в этом обработчике событий я использовал бы метод Element.fire для увольнения пользовательского события. Хотя этот шаг является дополнительным, он поможет в отделении обработчика событий от действия быть выполненным, и можно использовать тот же пользовательский обработчик событий от, говорит событие нажатия кнопки.
$(document.body).observe("keyup", function() {
if(/* key + modifier match */) {
$(document.body).fire("myapp:mycoolevent");
}
});
$(document.body).observe("myapp:mycoolevent", function() {
// Handle event.
});
Позже, для привязки того же события с нажатием кнопки:
$(button).observe("click", function() {
$(document.body).fire("myapp:mycoolevent");
});
До обработки модифицирующих клавиш затронут, проверьте этот ресурс (очень старый, но все еще выглядит применимым) для большего количества справки.