Qt QGraphicsScene不fitInView()与滚动条
Qt QGraphicsScene does not fitInView() with scrollbars
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。
为了避免这种情况,我这样做:
- 禁用更新
- 调用fitInView
- 调用QApplication:: processEvents ()
- 再次调用fitInView
- 启用更新
在你的代码中,它看起来像这样:
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年以来的错误。
- QScrollArea:由垂直滚动条引起的水平滚动条
- 跟踪滚动条上的鼠标事件
- 如何在不使用滚动条的情况下使视图更改
- 通过水平滚动条更改标签
- Qt:无法直接为带有子项的小部件添加滚动条
- OnVScroll : 从 CSpinButtonCtrl 或垂直滚动条调用?
- win32 滚动条在 C/C++ 程序中不起作用
- 外观 MFC 滚动条
- 停止 QTextCursor::insertText() 修改 QTextDocument 滚动条范围
- 如何在wxRadioBox中添加滚动条
- QPainter的QWidget滚动条
- 将水平滚动条添加到控制台
- QT - 如何创建具有长 int(而不是 int)步长的滚动条?
- QListWidget 水平滚动条会导致选择消失在视野之外
- 有没有办法有条件地检查窗口是否正在使用滚动条
- 滚动条到底部的QTableWidget
- CListCtrl 更新滚动条问题
- 如何在Qt中将文本附加到QPlainTextEdit并保持滚动条稳定?
- 如何在移动列表视图中添加滚动条?并且用户只能垂直滚动特定区域
- Qt QGraphicsScene不fitInView()与滚动条