QT - 用于不同目的的最佳绘画"画布"

Hon*_*nza 3 c++ graphics qt

我正在编写我的学士论文申请表,将有三种不同类型的图纸.我需要渲染/绘制/绘制分形结构:

  1. 迭代函数系统(绘制线条或简单路径,复制图形(或部分图形),对副本进行一些转换并迭代绘制)
  2. 逃逸时间算法(遍历画布的每个像素,计算其颜色和颜色像素)
  3. 艾略特波浪样本(通过给定点的路径 - 时间序列图;图形将由许多点制作,它不适合屏幕,所以我需要一些简单的移动控制(两个按钮与点击事件足够好) )

现在,我的问题是,你能推荐一些适合我目的的Qt方法(最简单的方法,如果可能的话)?

我找到了这些:

  1. Qt图形视图框架(我认为,这太"重")
  2. 画入像素图
  3. 继承小部件并覆盖paintEvent(如Qt的基本绘图示例中所示)
  4. Qt Can的Qt Canvas(但我对此一无所知)

我应该选择其中一些选项还是其他什么?
非常感谢,你会非常乐于助人.

Rei*_*ica 5

Re 1. QPainteron任何东西(小部件,像素图,打印机......)是一个简单的选择.

Re 2.处理像素QImage,然后在画家上绘制图像.

Re 3.在小部件上绘画就足够了.您可以基于您的小部件QAbstractScrollArea.

图形视图框架的最大特点是与场景中的项目交互.它使生活变得更加容易,并且应该用于一个人的优势.

如果您的视图是非交互式的,那么唯一的好处就是二进制空间分区索引,它会剔除放大时进行部分更新或更新所需的工作量.除非您允许放大/平移或进行部分更改,否则它是没有意义,因为Qt窗口是双缓冲的,你基本上不会做部分绘画.对于部分更改,更改的项目需要重新编制索引,除非它们的几何图形保持不变.

使用平移/缩放时,如果没有简单的方法来迭代要绘制的项目子集,则只应使用图形视图."硬"但通用的方法是使用BSP索引,而Graphics View系统提供此功能.我认为在你的情况下,应该很容易迭代给定场景矩形内的项目/基元.

对于绘图使用QPainter,你绘制的内容并不重要,这是一个小细节.您可以将绘图分解为包含需要绘制的数据的类,例如:

class IRenderable {
protected:
  /// Implementation of rendering.
  virtual void renderImpl(QPainter & painter, QRect target) = 0;
public:
  /// Draws all data (or the current view of it) 
  /// on the \a target rectangle of the \a painter.
  void render(QPainter & painter, QRect target) {
    renderImpl(painter, target);
  }
};

class IteratedFunctionSystem : public IRenderable {
  ... // members describing the IFS etc.

  /// Draws the entire IFS on the \a target rectangle of the \a painter.
  void renderImpl(QPainter & painter, QRect target) Q_DECL_OVERRIDE;
public:
  ...
};
Run Code Online (Sandbox Code Playgroud)

然后,您可以在通用小部件中使用它:

class RenderableVisualizer : public QWidget {
  QSharedPointer<IRenderable> m_renderable;
  void paintEvent(QPaintEvent * ev) {
    QPainter painter(this);
    m_renderable->render(painter, rect());
  }
public:
  RenderableVisualizer(
    QSharedPointer<IRenderable> renderable, QWidget * parent = 0
  ) : QWidget(parent), m_renderable(renderable)
  {}
};
Run Code Online (Sandbox Code Playgroud)

可以扩展此方法以添加选项以RenderableVisualizer具有本地后备存储并从单独的线程呈现给它.如果渲染很漫长,它将提供更平滑的GUI操作.