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与MSVC2010

最佳答案

两次调用fitInView()确实可以,但是您必须让Qt在两次调用之间处理其事件。

这也意味着您最终两次重画了graphicsview。

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

  • 禁用更新
  • 调用fitInView
  • 调用QApplication::processEvents()
  • 再次调用fitInView
  • 启用更新

  • 在您的代码中,它看起来像这样:
    bool updateState = updatesEnabled();
    setUpdatesEnabled(false);
    fitInView(clicked, Qt::KeepAspectRatio);
    QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
    fitInView(clicked, Qt::KeepAspectRatio);
    setUpdatesEnabled(updateState);
    

    10-06 03:25