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

Не мога да разбера как да накарам centerOn() да премества прозореца за изглед около елемента (или елемента около порта, не съм сигурен в кой път е).

Следният код работи основно:

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 се извиква веднага след създаването. Няма процес на цикъл на събития между 2 стъпки. Така че извикването paintEvent не го настройва правилно за новия елемент, да не говорим за промяната на центрирането.

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

Call centerOn извън всяко боядисване или актуализиране.

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