QGraphicsView-›centerOn() не работает

Я не могу понять, как заставить centerOn() перемещать область просмотра вокруг элемента (или элемента вокруг порта, не уверен, каким образом).

Следующий код работает в main:

view.setDragMode(QGraphicsView::ScrollHandDrag);
view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
view.setFrameStyle(QFrame::NoFrame);
view.showFullScreen();

QGraphicsPixmapItem *pmItem = new QGraphicsPixmapItem(pixMap);
scene.addItem(pmItem);

view.centerOn(QPointF(50,30));
view.show();
rc = qA.exec(); 

Однако centerOn() ничего не делает, когда я пытаюсь сделать то же самое из paintEvent() перегруженного QGraphicsView:

class MyView :: public QGraphicsView { ... }

void MyView::init(){
    ...
    setDragMode(QGraphicsView::ScrollHandDrag);
    setFrameStyle(QFrame::NoFrame);
    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

    _scene.clear();
    setScene(&_scene);

    super::showNormal();

}


void MyView::paintEvent(QPaintEvent *aEvent){
    _scene.clear();
    QGraphicsPixmapItem *pmItem = new QGraphicsPixmapItem(pixMap);
    _scene.addItem(pmItem);
    centerOn(QPointF(50.0, 30.0));

    super::paintEvent(aEvent);
}

Что мне не хватает? Спасибо

Алекс


person Alex    schedule 19.10.2012    source источник
comment
попробуйте переопределить функцию drawForeground вместо paintEvent. Это обычный способ возиться с вещами на просмотре. Я предполагаю, что представление не рисуется во время запуска paintEvent, и из-за этого координаты 30.0 и 50.0 недействительны.   -  person Castilho    schedule 19.10.2012
comment
Извините, что не ответил раньше. Я проверю это сегодня вечером и дам вам знать. Спасибо.   -  person Alex    schedule 19.10.2012


Ответы (2)


Вы в основном скрываете вызов paintEvent.

QGraphicsView взаимодействует с QGraphicsScene посредством сигналов и слотов. Сцена не имеет возможности уведомить представление о том, что в нее только что добавлен новый элемент, поскольку фактическое событие paintEvent вызывается сразу после создания. Между двумя шагами нет процесса цикла событий. Таким образом, вызов paintEvent не имеет правильной настройки для нового элемента, не говоря уже об изменении центрирования.

И как только картина закончена, вид проверяется и думает, что все нарисовано. Таким образом, он никогда не обновит область нового элемента.

Колл-центрВне любого события покраски или обновления.

person Stephen Chu    schedule 19.10.2012
comment
Извините, что не ответил раньше. Звучит разумно, хотя элемент действительно обновляется и окрашивается в paintEvent. Я проверю это сегодня вечером и дам вам знать. Спасибо. - person Alex; 19.10.2012
comment
Отлично работает с MouseMoveEvent. Спасибо - person Alex; 22.10.2012

Я решил эту проблему, установив высокое значение для setSceneRect. Затем я сосредоточиваю сцену на объекте или позиции.

пример:

this->ui->graphicsView->setSceneRect (0,0,100000000, 100000000);
this->ui->graphicsView->centerOn(500,1030);

С размером setSceneRect GraphicsView работает неправильно.

person Willyan    schedule 17.04.2014