c++ - 如何在调整大小时保持相同的场景部分可见?

标签 c++ qt qt5 qgraphicsview

我正在使用 QGraphicsView 来显示函数图之类的东西。 QGraphicsView 在调整大小时保持其变换,因此场景的可见部分发生变化。

我需要在调整大小时保持 View 完全相同 - 纵横比不必保持不变,因为我允许在 X 轴和 Y 轴上进行独立缩放。

这不起作用:

void resizeEvent(QResizeEvent *event) override
{
    QRectF rect = mapToScene(this->viewport()->rect()).boundingRect();
    QGraphicsView::resizeEvent(event);
    fitInView(rect);
}

问题在于获取正确的 View 矩形。此解决方案会在调整大小时缩小。

有没有什么简单的方法可以做到这一点?

最佳答案

我遇到了完全相同的问题。当 View 的大小发生变化时,您需要手动缩放 View ,并恢复旧的中心点。在 python 中:

def resizeEvent(self, event):
    w_ratio = self.rect().width() / event.oldSize().width()
    h_ratio = self.rect().height() / event.oldSize().height()
    self.scale(w_ratio, h_ratio)

    self.centerOn(self.old_center)

你显然需要提前设置self.old_center,例如在 showEvent() 中。如果用户可以翻译 View ,您还需要在 mouseReleaseEvent() 中更新 self.old_center

def showEvent(self, event):
    self.old_center = self.mapToScene(self.rect().center())

def mouseReleaseEvent(self, event):
    super(MyView, self).mouseReleaseEvent(event)
    self.old_center = self.mapToScene(self.rect().center())

关于c++ - 如何在调整大小时保持相同的场景部分可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25303022/

相关文章:

c++ - std::set::insert:使用用户定义的类复制

c++ - 当 QMainWindow 调整大小时,QDockWidget 分割器会跳转

c++ - 有什么方法可以检索 CEditBox 中文本的文本高度(以像素为单位)?

c++ - 将 float 转换为 32 位十六进制 C++

C++:在 main() 之外播种随机数生成器

c++ - OpenEXR 到 QImage 的转换

c++ - Qt 可以缩短一条线,使其不退出到达终点吗?

c++ - 如何在不打开 Qt 新窗口的情况下更改 UI?

qt - QML 中的时间选择器

c++ - Qt 5.7.1/GCC 6.3.0:错误:constexpr函数的主体'静态constexpr int QMetaTypeId2 <T>