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
答案 0 :(得分:3)
调用fitInView()两次确实有效,但你必须让Qt在两次调用之间处理它的事件。
这也意味着你最终重新绘制了两次图形视图。
为避免这种情况,我所做的是:
在您的代码中,它看起来像这样:
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年以来的错误。