QwtGraphicsView缩放比例转换裁剪图形对象

时间:2018-11-29 19:28:12

标签: c++ qt qgraphicsview qgraphicsitem

使用相应的代码通过可视数据流程序(https://github.com/paceholder/nodeeditor)模拟计算器,我制作的节点要比代码中使用的节点大一些,并手动设置它们的大小。但是,当我用鼠标滚轮放大QGraphicsView(称为FlowView)时,代码使用QGraphicsView :: scale()函数转换为放大视图的新矩阵,并且根本不显示部分节点,如在以下图片中:

与节点的连接缩小

与节点的连接放大

这是我在NodeGeometry.cpp中更改的代码的一部分,以更改节点的大小:

void
NodeGeometry::
recalculateSize() const
{
//  _entryHeight = _fontMetrics.height();

//  {
//    unsigned int maxNumOfEntries = std::max(_nSinks, _nSources);
//    unsigned int step = _entryHeight + _spacing;
//    _height = step * maxNumOfEntries;
//  }

//  if (auto w = _dataModel->embeddedWidget())
//  {
//    _height = std::max(_height, static_cast<unsigned>(w->height()));
//  }

//  _height += captionHeight();

//  _inputPortWidth  = portWidth(PortType::In);
//  _outputPortWidth = portWidth(PortType::Out);

//  _width = _inputPortWidth +
//           _outputPortWidth +
//           2 * _spacing;

//  if (auto w = _dataModel->embeddedWidget())
//  {
//    _width += w->width();
//  }

//  _width = std::max(_width, captionWidth());

//  if (_dataModel->validationState() != NodeValidationState::Valid)
//  {
//    _width   = std::max(_width, validationWidth());
//    _height += validationHeight() + _spacing;
//  }

  //Size Tests
  _height = 600;
  _width = 1000;
}

如何更改此代码,以确保不会修剪对象?

我注意到的事情

  • 窗口的大小会改变节点的裁剪程度,与缩放相同。

  • 移动节点不会改变其擦除数量或擦除位置;

  • 它从节点的右到左以及从下到上发生;

  • 更多缩放=更多内容消失了。

我相信关键文件是FlowView.cpp,FlowScene.cpp,NodePainter.cpp,NodeGraphicsObject.cpp,但我不知道如何进行。

此外,我需要使节点具有此大小,因为我试图在其中使用来自qwt的绘图画布,并且该画布具有最小高度。

1 个答案:

答案 0 :(得分:0)

可能是因为您每次修改节点的大小时都需要调用update()重新绘制节点并修改边界矩形,否则画家将使用一个过时的边界矩形来决定要绘制的内容以及要绘制的内容不油漆。使用QGraphicsView::scale()和自定义绘画工具时,我遇到了类似的问题。设置update()_height之后,尝试放入_width,看看是否可以解决。

您还可以查看调整窗口大小时是否正在调用NodeGeometry::boundingRect(),这将告诉您边界矩形是否正确更新