У меня есть свой собственный QGraphicsPixmapItem, который состоит из QGraphicsPixmapItem и некоторых дополнительных атрибутов (например, std::string name
)
class MyQGraphicsPixmapItem : public QGraphicsPixmapItem {
private:
std::string name;
...
public:
MyQGraphicsPixmapItem();
explicit MyQGraphicsPixmapItem(const QPixmap &pixmap, std::string name, QGraphicsItem *parent = nullptr);
std::string getname() const;
...
};
И конструктор выглядит так:
MyQGraphicsPixmapItem::MyQGraphicsPixmapItem(const QPixmap &pixmap, std::string name, QGraphicsItem *parent) :
QGraphicsPixmapItem(pixmap, parent), name(name){
...
}
Вот проблема: у меня есть куча MyQGraphicsPixmapItem
, которые я добавляю в QGraphicsScene
. Но когда я использую метод QGraphicsScene::itemAt(const QPointF &position, const QTransform &deviceTransform) const
, он возвращает QGraphicsItem*
(не MyQGraphicsPixmapItem*
). Итак, я полагаю, что я должен использовать право понижения? Но даже после использования броска вниз, как это:
MyQGraphicsPixmapItem* item = static_cast<MyQGraphicsPixmapItem*>(QGraphicsScene::itemAt(...));
std::cout << item->getName() << std::endl;
возвращает пустую строку (как не было this.name = name;
, как показано в конструкторе).
В заключение я создаю группу MyQGraphicsPixmapItem
в QGraphicsScene
с правильной name
инициализацией (я проверял ее с std::cout
во время создания QGraphicsScene
), но когда я хочу случайным образом выбрать QGraphicsItem
и проверь, как его зовут, я использую QGraphicsScene::itemAt
, который каждый раз сбрасывает std::string name
, чтобы опустошиться, несмотря на понижение.
Кроме того, я очень уверен, что указываю на правильные MyQGraphicsPixmapItem
с правильными аргументами (я провел несколько тестов).
Я также думал о реализации правильного "itemAt" в моем классе "MyScene" (который, как вы уже догадались, наследует от "QGraphicsScene"), но я бы снова использовал type_casting.
PS: Скажите, правильно ли задан мой вопрос.
С уважением