Russian Qt Forum
Сентябрь 29, 2024, 22:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QGrapicsScene::itemAt  (Прочитано 2959 раз)
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)))
                   ->setPos(100,100);

Запускаю. Картинка абсолютно нормальная.

Теперь обрабочтик GraficsView::mouseMoveEvent проверяет, какой элемент под мышкой и получает абсолютно на мой взгляд неадекватные вещи:
  x < 50, y<100 - под мышкой график
  x и y внутри прямоугольника - под мышкой прямоугольник
  остальные случаи - под мышкой НИЧЕГО.

Код:
GraphicItem::boundingRect() = QRectF(0, -33000, 6000, 66000);
GraphicItem::shape()           = path.addRect( boundingRect );

Скажите пожалуйста, в чем я туплю, почему под теми точками, под которыми до добавления прямогугольника лежал GraphicItem, после добавления если верить сцене то не лежит ничего?

проверяю принадлежность так:
Код:
    QPoint         mousePosition = event->pos();
    QGraphicsItem* currentItem   = itemAt(mousePosition);
    QList<QGraphicsItem *> currentItems = items(mousePosition);




ЗЫ. Только что провел эксперимент - добавил по таймеру через 10 секунд... И все работает... [CENSORED]

Код:
GraphWidget::GraphWidget(QWidget* parent)
 : QWidget               (parent)
 , ui                    (new Ui::GraphWidget)
 , m_graphicsScene       (new QGraphicsScene )
 , m_graphic             (new StereoGraphItem())
 , m_stereoSeparatorItem (NULL)
{
    ui->setupUi(this);


    // установка параметров графика
    m_graphic->setPos(0,0);
    m_graphic->setGraphicPenColor( m_defaultGraphicPenColor );
    m_graphic->setGridColor      ( m_defaultGridColor );


    m_graphicsScene->addItem           ( m_graphic );
    // если тут сделать добавление прямоугольника (круга, треугольника, машинки, вертолета) - будет задница

    startTimer(2000);


    m_graphicsScene->setBackgroundBrush( m_defaultGraphicBackground );

    // установка параметров вида
    ui->graphicsView->setScene              ( m_graphicsScene );
    ui->graphicsView->setViewport           ( new QGLWidget(QGLFormat(QGL::SampleBuffers)) );
    ui->graphicsView->linkVerticalLineBar   ( ui->verticalLineBar   );
    ui->graphicsView->linkHorizontalLineBar ( ui->horizontalLineBar );
    ui->graphicsView->setBackgroundBrush    ( m_defaultGraphicBackground );
    ui->graphicsView->scale(1,0.002);

    // установка параметров линеек по осям
    ui->verticalLineBar->setLabelColor      ( m_defaultLabelsColor );
    ui->horizontalLineBar->setLabelColor    ( m_defaultLabelsColor );
    ui->verticalLineBar->setLabelsCount     ( m_defaultLabelsCount );
    ui->horizontalLineBar->setLabelsCount   ( m_defaultLabelsCount );

    setLayout( ui->gridLayout);
}


void GraphWidget::timerEvent(QTimerEvent *event)
{
    m_graphicsScene->addRect(0, 0, 100, 10000, QPen(QColor(255,0,0,100)), QBrush(QColor(255,0,0,100)))
                   ->setPos(100,100);
}

Если добавить прямоугольник в том же месте, где добавляется m_graphic - проблема появляется... Понимаю, что упустил что-то важное и простое, но что - понять не могу.

ЗЗЫ. Никакие GraphWidget::update() или GraphWidget::repaint() или m_scene->update() не спасают. Добавление элемента в самом конце конструктора после апдейтов и репеинтов проблему не устраняет. Добавление в обработчике таймера с одной миллисекундой проблему решает. Ступор.
« Последнее редактирование: Ноябрь 06, 2009, 20:21 от SpiritFire » Записан
shadone
Гость
« Ответ #1 : Ноябрь 07, 2009, 01:35 »

проверяю принадлежность так:
Код:
    QPoint         mousePosition = event->pos();
    QGraphicsItem* currentItem   = itemAt(mousePosition);
    QList<QGraphicsItem *> currentItems = items(mousePosition);

currentItem = itemAt(mapToScene(mousePosition));
Записан
SpiritFire
Гость
« Ответ #2 : Ноябрь 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 принимает координаты в координатной системе вида, а вы предлагаете перевести их в координаты сцены. К тому же, в примере опять-таки используются координаты вида. Я где-то не прав или вы ошиблись?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.125 секунд. Запросов: 21.