Название: QGrapicsScene::itemAt Отправлено: SpiritFire от Ноябрь 06, 2009, 19:56 Прошу прощения за идиотский вопрос, но пол-дня мозгового штурма привели только к тому, что смотреть не знаю, куда...
Есть сцена (стандартная). На ней есть пользовательский элемент (график). Больше ничего. Есть GraficsView, в нем переопределен обработчик mouseMoveEvent. Новый обработчик: - если под мышкой график, и нажата левая кнопка, то скроллить вид в направлении, обратном перетягиванию (как в AdobeReadere страничка тягается) - если под мышкой не график - вызывается стандартный обработчик. Все отлично работает, просто прекрасно. Добавляю на сцену любой элемент, например Код: m_graphicsScene->addRect(0, 0, 100, 10000, QPen(QColor(255,0,0,100)), QBrush(QColor(255,0,0,100))) Запускаю. Картинка абсолютно нормальная. Теперь обрабочтик GraficsView::mouseMoveEvent проверяет, какой элемент под мышкой и получает абсолютно на мой взгляд неадекватные вещи: x < 50, y<100 - под мышкой график x и y внутри прямоугольника - под мышкой прямоугольник остальные случаи - под мышкой НИЧЕГО. Код: GraphicItem::boundingRect() = QRectF(0, -33000, 6000, 66000); Скажите пожалуйста, в чем я туплю, почему под теми точками, под которыми до добавления прямогугольника лежал GraphicItem, после добавления если верить сцене то не лежит ничего? проверяю принадлежность так: Код: QPoint mousePosition = event->pos(); ЗЫ. Только что провел эксперимент - добавил по таймеру через 10 секунд... И все работает... [CENSORED] Код: GraphWidget::GraphWidget(QWidget* parent) Если добавить прямоугольник в том же месте, где добавляется m_graphic - проблема появляется... Понимаю, что упустил что-то важное и простое, но что - понять не могу. ЗЗЫ. Никакие GraphWidget::update() или GraphWidget::repaint() или m_scene->update() не спасают. Добавление элемента в самом конце конструктора после апдейтов и репеинтов проблему не устраняет. Добавление в обработчике таймера с одной миллисекундой проблему решает. Ступор. Название: Re: QGrapicsScene::itemAt Отправлено: shadone от Ноябрь 07, 2009, 01:35 проверяю принадлежность так: Код: QPoint mousePosition = event->pos(); currentItem = itemAt(mapToScene(mousePosition)); Название: Re: QGrapicsScene::itemAt Отправлено: SpiritFire от Ноябрь 09, 2009, 17:22 Цитировать QGraphicsItem * QGraphicsView::itemAt ( const QPoint & pos ) const Returns the item at position pos, which is in viewport coordinates. If there are several items at this position, this function returns the topmost item. Example: void CustomView::mousePressEvent(QMouseEvent *event) { if (QGraphicsItem *item = itemAt(event->pos())) { qDebug() << "You clicked on item" << item; } else { qDebug() << "You didn't click on an item."; } } В документации сказано, что itemAt принимает координаты в координатной системе вида, а вы предлагаете перевести их в координаты сцены. К тому же, в примере опять-таки используются координаты вида. Я где-то не прав или вы ошиблись? |