Qt QGraphicsScene不fitInView()与滚动条

Qt QGraphicsScene does not fitInView() with scrollbars

本文关键字:滚动条 fitInView QGraphicsScene Qt      更新时间:2023-10-16

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

有一个相关的bug报告(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

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

这也意味着你最终需要重新绘制两次graphicsview。

为了避免这种情况,我这样做:

  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);

原因可能是这样的(至少看起来是在bug报告中):https://bugreports.qt.io/browse/QTBUG-42331 -请在qt bug跟踪器上投票,以提高其优先级。

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

你可以通过重新实现fitInView来解决这个问题,基于现有的实现,但删除它的荒谬的边际。这里有一个基于原始c++版本的python示例:

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

让我知道它是否解决了你的问题!这样我们也可以关闭自2007年以来的错误。