QwtGraphicsView масштабное преобразование отсечения графических объектов - PullRequest
0 голосов
/ 29 ноября 2018

Использование соответствующего кода для имитации калькулятора с помощью программы визуального потока данных (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;
}

Как я могу изменить этот код, чтобы быть уверенным, что объекты не будут обрезаны?

Вещи, которые я заметил:

  • Размер окна изменяет, насколько сильно обрезается узел, так же, как и увеличение.

  • Перемещение узла выиграноt изменить, сколько или где оно стерто;

  • Это происходит справа налево и снизу к верхней части узла;

  • Больше зума = больше этого нет.

Я считаю, что ключевыми файлами являются FlowView.cpp, FlowScene.cpp, NodePainter.cpp, NodeGraphicsObject.cpp, но я не знаю, какдля продолжения.

Кроме того, мне нужно, чтобы узлы были такого размера, так как я пытаюсь использовать в нем холст графика из qwt, и он имеет минимальную высоту.

1 Ответ

0 голосов
/ 29 ноября 2018

Возможно, потому что вам нужно вызвать update(), чтобы перекрасить узел и изменить ограничивающий прямоугольник каждый раз, когда вы изменяете размер узла, иначе художник будет использовать устаревший ограничивающий прямоугольник, чтобы решить, что рисовать, а что нет.покрасить.У меня была похожая проблема при использовании QGraphicsView::scale() с пользовательским художником.Попробуйте поставить update() после установки _height и _width и посмотреть, исправит ли это.

Вы также можете проверить, вызывается ли NodeGeometry::boundingRect() при изменении размера окна, это будетсообщить вам, правильно ли обновляется ограничивающий прямоугольник

...