【问题标题】:Qt QGraphicsScene does not fitInView() with scrollbarsQt QGraphicsScene 不适合带有滚动条的 InView()
【发布时间】:2014-05-02 02:25:27
【问题描述】:

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

【问题讨论】:

    标签: c++ qt scrollbar qgraphicsview


    【解决方案1】:

    两次调用 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);
    

    【讨论】:

      【解决方案2】:

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

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

      您可以通过在现有实现的基础上重新实现 fitInView 来解决此问题,但删除它的可笑边距。基于原始 C++ 版本的 python 中提供了一个示例:

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

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

      【讨论】:

        猜你喜欢
        • 2012-07-07
        • 2012-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多