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。
为了避免这种情况,我要做的是:
在您的代码中,它看起来像这样:
bool updateState = updatesEnabled();
setUpdatesEnabled(false);
fitInView(clicked, Qt::KeepAspectRatio);
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
fitInView(clicked, Qt::KeepAspectRatio);
setUpdatesEnabled(updateState);