在 QGraphicsView 中滚动

Posted

技术标签:

【中文标题】在 QGraphicsView 中滚动【英文标题】:Scrolling in QGraphicsView 【发布时间】:2013-06-17 07:01:21 【问题描述】:

我时遇到问题。

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于在 QGraphicsView 中滚动的主要内容,如果未能解决你的问题,请参考以下文章

滚动 QGraphicsView 和 QGraphicsScene

QT中QGraphicsView中的手指滚动?

在 QGraphicsView 中创建自动滚动功能

滚动其中一个时如何滚动多个QGraphicsView(无滚动条)

如何在QGraphicsview中超越滚动条范围?

QGraphicsView 自定义滚动条