Qt QGraphicsScene不适合带有滚动条的InView()

时间:2014-03-24 15:55:51

标签: c++ qt scrollbar qgraphicsview

QGraphicsView::fitInView()似乎忽略了滚动条的存在,这显然是重叠的。 (它还使用硬编码的2像素边距。)

有一个相关的错误报告(https://bugreports.qt-project.org/browse/QTBUG-1047)声明两次调用fitInView()可以解决问题。

在我的情况下,它没有。对于滚动条,仅手动触发两次。这不起作用:

void myGraphicsView::mousePressEvent(QMouseEvent *event) {
  if( event->button() == Qt::LeftButton ) {
    QGraphicsItem* clicked = scene()->itemAt( mapToScene( event->pos() ) );
    qDebug() << clicked << clicked->boundingRect();
    fitInView( clicked, Qt::KeepAspectRatio);
    fitInView( clicked, Qt::KeepAspectRatio); // doesn't work for me
    QGraphicsView::mousePressEvent(event);
    return;
  }
}

还有其他解决方法吗?

Qt 4.8.1 with MSVC2010

2 个答案:

答案 0 :(得分:3)

调用fitInView()两次确实有效,但你必须让Qt在两次调用之间处理它的事件。

这也意味着你最终重新绘制了两次图形视图。

为避免这种情况,我所做的是:

  1. 停用更新
  2. 致电fitInView
  3. 调用QApplication :: processEvents()
  4. 再次致电fitInView
  5. 启用更新
  6. 在您的代码中,它看起来像这样:

    bool updateState = updatesEnabled();
    setUpdatesEnabled(false);
    fitInView(clicked, Qt::KeepAspectRatio);
    QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
    fitInView(clicked, Qt::KeepAspectRatio);
    setUpdatesEnabled(updateState);
    

答案 1 :(得分:1)

原因可能是这个(至少它看起来像是在bug报告中):https://bugreports.qt.io/browse/QTBUG-42331 - 请在qt bug跟踪器上对其进行投票以确定其优先级。

简而言之,fitInView具有硬编码边距,这可能会造成各种各样的破坏 - 其中最不重要的是现在你丢失了几个像素的显示区域,并且可能还会强制进行不必要的重新缩放。它可能导致失控的大小调整和奇怪的不稳定性,例如QTBUG-1047错误提交者描述的内容。

您可以通过重新实现fitInView来解决问题,基于现有的实现,但删除它的荒谬边距。基于原始的C ++版本,可以在python中找到一个例子:

https://github.com/nevion/pyqimageview/blob/master/qimageview/widget.py#L276

如果它解决了您的问题,请告诉我!这样我们就可以了解自2007年以来的错误。