滚动QGraphicsView

时间:2013-06-17 07:01:21

标签: c++ qt qgraphicsview

我在QGraphicsView中滚动时遇到问题。

我在QGraphicsView子类中设置了scene rect:

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中找到了几个关于滚动的主题,但没有一个能解决我的问题。

1 个答案:

答案 0 :(得分:2)

QGraphicsView继承QAbstractScrollArea。因此,其内容显示在其内部窗口小部件中,可以使用viewport()获取。如果要绘制某些内容并能够滚动它,则需要将事件过滤器附加到视口窗口小部件并处理其paintEvent,而不是视图的事件。

但你不应该为QGraphicsView这样做。你正试图做一些非常错误的事情。你不应该重新实现QGraphicsView::paintEvent只是为了画画!它完全贬低了它的优势。您需要使用QGraphicsScene向视图中添加内容。