Прокрутка в QGraphicsView

У меня проблема с прокруткой в ​​QGraphicsView.

Я установил прямоугольник сцены в своем подклассе QGraphicsView:

MyQGraphicsView::MyQGraphicsView{
    setSceneRect(0,0,2000,2000)
}

И перегрузил paintEvent:

void MyQGraphicsView::paintEvent(QPaintEvent *event){
    qDebug()<<"Paint event";
    QPainter painter(viewport());
    painter.setRenderHint(QPainter::Antialiasing);
    paint(painter);
}
void MyQGraphicsView::paint(QPainter &painter){
    painter.setPen(Qt::NoPen);
    painter.fillRect(QRect(0,0,200,200),Qt::gray);
    painter.fillRect(QRect(500,500,1000,100),Qt::green);
    painter.setPen(QPen(Qt::white,4,Qt::DashLine));
    painter.drawLine(QLine(0,35,200,35));
    painter.drawLine(QLine(0,165,200,165));
}

При прокрутке второй прямоугольник не виден. Когда я изменяю размер окна, это так. Также при прокрутке прямоугольник расширяется проводным способом.

Как реализовать прокрутку в этом случае? Я нашел несколько тем о прокрутке в QGraphicsView, но ни одна из них не решает мою проблему.


person krzych    schedule 17.06.2013    source источник


Ответы (1)


QGraphicsView наследует QAbstractScrollArea. Таким образом, его содержимое отображается во внутреннем виджете, который можно получить с помощью viewport(). Если вы хотите что-то нарисовать и иметь возможность прокручивать это, вам нужно прикрепить фильтр событий к виджету области просмотра и обработать его paintEvent, а не событие представления.

Но не стоит этого делать для QGraphicsView. Ты пытаешься сделать что-то ужасно неправильное. Вы не должны переопределять QGraphicsView::paintEvent только для того, чтобы что-то нарисовать! Это полностью обесценивает его преимущества. Вам нужно использовать QGraphicsScene, чтобы добавить что-то в представление.

person Pavel Strakhov    schedule 17.06.2013