А если у меня немного другая задача - у меня

есть класс 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);
}

И вот при нажатии левой кнопкой мыши я хочу получать какое-то имя или идентификатор объекта, на который нажимаю

12 ответов

21 просмотр

Просто qDebug() << item; Вон глянь исходники operator << https://code.woboq.org/qt5/qtbase/src/widgets/graphicsview/qgraphicsitem.cpp.html#_Zls6QDebugP13QGraphicsItem

Valder-Man Автор вопроса
Mr.Mait
Просто qDebug() << item; Вон глянь исходники opera...

Окей, это и правда работает, а что если я хочу не адрес объекта (Выводит что-то типа 0x55d968b3f9c0) а прям имя класса? Ну или что-то, что больше понятно человеку? Просто судя по коду, который вы скинули там должен прям нормальный такой вывод быть, понятный. А мне пока выводит только адрес, у меня есть предположение что это просто печать указателя и все

Valder Man
Окей, это и правда работает, а что если я хочу не ...

Понял в чем дело. Тебе надо унаследоваться тогда от QGraphicsObject. Получить объект можно так: itemAt(position).toGraphicsObject(); Потом выводи в дебаг. Перед этим проверяй что объект не пустой

Valder-Man Автор вопроса
Mr.Mait
Понял в чем дело. Тебе надо унаследоваться тогда о...

А мои объекты должны наследоваться и от QGraphicsObject, и от QGraphicsItem ? Или это избыточно ?

Valder Man
А мои объекты должны наследоваться и от QGraphicsO...

Избыточно. Просто у QGraphicsItem нет метаобъектной информации. Просто наследуешься от QGraphicsObject и работаешь как с обычными QGraphicsItem. Будет метаобъектная информация и будет в дебаг вывоить имя класса и имя объекта если есть.

Valder-Man Автор вопроса
Mr.Mait
Избыточно. Просто у QGraphicsItem нет метаобъектно...

Да, понял, пошел пробовать. Спасибо большое за развернутые ответы!

Valder-Man Автор вопроса
Mr.Mait
Избыточно. Просто у QGraphicsItem нет метаобъектно...

А могли бы вы мне еще подсказать, что делать с объектом, который наследуется от QGraphicsPathItem? Просто у меня встала проблема, что я не хочу переопределять метод boundingRect для желтой линии (в случае если наследование идет от QGraphicsObject). И если я правильно понял, то переопределив его, у меня увеличится область кликабельности на эту линию, а этого совсем не хотелось бы

Valder Man
А могли бы вы мне еще подсказать, что делать с объ...

Нагуглил https://kb.froglogic.com/squish/qt/howto/explicitly-naming-qgraphicsitem-objects/ Там в предпоследнем заголовке говорится что если конкретный тип итема, то нужно множественное наследование. А потом итем помещать на сцену так scene->addItem(static_cast<QGraphicsObject*>(item))

Valder-Man Автор вопроса
Mr.Mait
Нагуглил https://kb.froglogic.com/squish/qt/howto/...

К сожалению, после следующей записи class NodeEdge : public QGraphicsObject, public QGraphicsPathItem Проблема с переопределением boundingRect() все еще осталась. Я просто слабо себе представляю, что нужно возвращать в этом методе, что б у меня получилась коректно работающая линия...

Valder Man
К сожалению, после следующей записи class NodeEdg...

Я не работал с множественным наследованием, по идее переопредели boundRect и внутри return QGraphicsPathItem::boundingRect()

Valder Man
К сожалению, после следующей записи class NodeEdg...

Там же по ссылке выше написано 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)

Valder-Man Автор вопроса
Mr.Mait
Там же по ссылке выше написано However, this means...

Да, спасибо за помощь, теперь все работает как и планировалось! Написав следующий велосипед: QRectF NodeEdge::boundingRect () const { return QGraphicsPathItem::boundingRect(); } И явно задав все методы, которые использую в этом классе, типа: QGraphicsObject::setFlag(QGraphicsItem::ItemIsSelectable); QGraphicsObject::setZValue(-1); ... Логика работы класса наконец-то восстановилась. Не самое красивое, конечно, решение. Но оно работает!

Похожие вопросы

Обсуждают сегодня

Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
Объясните, пожалуйста, почему компилятор ругается на использование в условии неинициализированной переменной: int x; Task.Run(async () => { x = await somefunc(); }).Wait...
Александр
5
Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
Коллеги, может знает кто, можно ли цвет бейджа счётчика в BackendMenu менять без бубнов?
Alex Blaze
3
а плаксы из-под питона умеют только в комфортных условиях что-то выдавить из себя?)
Lencore
9
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
13
Привет!) Кто как юзает переменные в строках?) Чисто ради интереса Вот так: echo "У меня {$bananasAmount} бананов"; Или вот так: echo "У меня ${bananasAmount} бананов";
Виталий
3
разработчик ботов скидывает портфолио, боты которые он уже создал. А вот как узнать что это именно он их создал?
Gosudar
4
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Карта сайта