Прошу прощения за идиотский вопрос, но пол-дня мозгового штурма привели только к тому, что смотреть не знаю, куда...
Есть сцена (стандартная).
На ней есть пользовательский элемент (график). Больше ничего.
Есть 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() не спасают. Добавление элемента в самом конце конструктора после апдейтов и репеинтов проблему не устраняет. Добавление в обработчике таймера с одной миллисекундой проблему решает. Ступор.