есть класс QDMGraphicsView, который наследуются от QGraphicsView, просто кастомные настройки сцены, по сути -
в нем у меня такой вот метод определен:
const QGraphicsItem* QDMGraphicsView::getItemAtClick(QMouseEvent *event)
{
const QPoint position = event->pos();
const QGraphicsItem* obj = itemAt(position);
return obj;
}
И этот метод вызывается вот здесь:
void QDMGraphicsView::leftMouseButtonPress(QMouseEvent *event)
{
#ifdef QT_DEBUG
const QGraphicsItem* item = getItemAtClick(event);
qDebug() << item->/*?????*/;
#endif
QGraphicsView::mousePressEvent(event);
}
И вот при нажатии левой кнопкой мыши я хочу получать какое-то имя или идентификатор объекта, на который нажимаю
Просто qDebug() << item; Вон глянь исходники operator << https://code.woboq.org/qt5/qtbase/src/widgets/graphicsview/qgraphicsitem.cpp.html#_Zls6QDebugP13QGraphicsItem
Окей, это и правда работает, а что если я хочу не адрес объекта (Выводит что-то типа 0x55d968b3f9c0) а прям имя класса? Ну или что-то, что больше понятно человеку? Просто судя по коду, который вы скинули там должен прям нормальный такой вывод быть, понятный. А мне пока выводит только адрес, у меня есть предположение что это просто печать указателя и все
Понял в чем дело. Тебе надо унаследоваться тогда от QGraphicsObject. Получить объект можно так: itemAt(position).toGraphicsObject(); Потом выводи в дебаг. Перед этим проверяй что объект не пустой
А мои объекты должны наследоваться и от QGraphicsObject, и от QGraphicsItem ? Или это избыточно ?
Избыточно. Просто у QGraphicsItem нет метаобъектной информации. Просто наследуешься от QGraphicsObject и работаешь как с обычными QGraphicsItem. Будет метаобъектная информация и будет в дебаг вывоить имя класса и имя объекта если есть.
Да, понял, пошел пробовать. Спасибо большое за развернутые ответы!
А могли бы вы мне еще подсказать, что делать с объектом, который наследуется от QGraphicsPathItem? Просто у меня встала проблема, что я не хочу переопределять метод boundingRect для желтой линии (в случае если наследование идет от QGraphicsObject). И если я правильно понял, то переопределив его, у меня увеличится область кликабельности на эту линию, а этого совсем не хотелось бы
Нагуглил https://kb.froglogic.com/squish/qt/howto/explicitly-naming-qgraphicsitem-objects/ Там в предпоследнем заголовке говорится что если конкретный тип итема, то нужно множественное наследование. А потом итем помещать на сцену так scene->addItem(static_cast<QGraphicsObject*>(item))
К сожалению, после следующей записи class NodeEdge : public QGraphicsObject, public QGraphicsPathItem Проблема с переопределением boundingRect() все еще осталась. Я просто слабо себе представляю, что нужно возвращать в этом методе, что б у меня получилась коректно работающая линия...
Я не работал с множественным наследованием, по идее переопредели boundRect и внутри return QGraphicsPathItem::boundingRect()
Там же по ссылке выше написано However, this means you will indirectly multiply-inherit from QGraphicsItem. You must make sure all virtual functions are properly overridden to do the right thing(s)
Да, спасибо за помощь, теперь все работает как и планировалось! Написав следующий велосипед: QRectF NodeEdge::boundingRect () const { return QGraphicsPathItem::boundingRect(); } И явно задав все методы, которые использую в этом классе, типа: QGraphicsObject::setFlag(QGraphicsItem::ItemIsSelectable); QGraphicsObject::setZValue(-1); ... Логика работы класса наконец-то восстановилась. Не самое красивое, конечно, решение. Но оно работает!
Обсуждают сегодня