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

han*_*dle 1 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

还有其他解决方法吗?

Qt 4.8.1 与 MSVC2010

小智 6

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

这也意味着您最终会重绘图形视图两次。

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

  1. 禁用更新
  2. 调用 fitInView
  3. 调用 QApplication::processEvents()
  4. 再次调用 fitInView
  5. 启用更新

在您的代码中,它看起来像这样:

bool updateState = updatesEnabled();
setUpdatesEnabled(false);
fitInView(clicked, Qt::KeepAspectRatio);
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
fitInView(clicked, Qt::KeepAspectRatio);
setUpdatesEnabled(updateState);
Run Code Online (Sandbox Code Playgroud)