QT - 不同用途的最佳绘图“画布”

6
我正在编写本科论文应用程序,其中将有三种不同类型的图形。我需要渲染/绘制/涂抹由以下方式制成的分形结构:
1. 迭代函数系统(绘制线条或简单路径,复制绘画(或其一部分),对副本进行几次转换并迭代性地绘制它) 2. 逃逸时间算法(经过每个画布像素,计算其颜色并对像素进行着色) 3. Elliot波纹样本(通过给定点的路径 - 时间序列图;图表由许多点组成,它们不适合于屏幕,因此我需要一些简单的移动控制(两个带有“点击”事件的按钮就足够了))
现在,我的问题是,您能否推荐一些适合我的目的的Qt方法(如果可能的话,最简单的方法)?
我找到了以下选项:
1. Qt图形视图框架(我认为这太“笨重”了) 2. 在像素图中绘制 3. 继承窗口部件并覆盖paintEvent(如Qt的基本绘图示例所示) 4. Qt Quick的Qt Canvas(但我对它一无所知)
我应该选择这些选项之一还是其他任何选项?谢谢你,你会非常有帮助。
2个回答

5

关于 IT 技术的翻译:

1. 在任何地方(小部件、像素图、打印机等)上使用 QPainter 都是一个简单的选择。

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

3. 在小部件上绘制即可。您可以基于 QAbstractScrollArea 创建小部件。

Graphics View Framework 的最大优点是与场景中的项目交互。这使得生活变得更加轻松,应该充分利用它。

如果您的视图不可交互,则唯一的好处就是二进制空间分区索引,它可以在需要进行部分更新或缩放时减少工作量。除非允许缩放/平移或进行部分更改,否则它是毫无意义的,因为 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:
  ...
};

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

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)
  {}
};

这种方法可以扩展,添加一个选项到RenderableVisualizer,使其具有本地备份存储并从单独的线程进行渲染。如果渲染需要很长时间,它将提供更流畅的GUI操作。

1

看看我在这里提供的一些最近的替代方案。我建议使用Qt Quick和QQuickPaintedItem,因为它提供了熟悉的QPainter API,并且最好在C++中完成你描述的类型的操作。

有关QPainter API的信息,请参见绘图示例,有关基本绘图的信息,请参见基本绘图示例


谢谢你的回答。我尝试寻找一些教程或示例,但是我没有找到任何有用的东西。你不会碰巧知道什么吗?只需要一个简单的绘制线条的示例,几个简单的变换或者我可以从中开始的东西即可。谢谢。 - Honza
绘画方面的文档非常好,我已经添加了两个与您相关的链接。 - Mitch
QQuickPaintedItem 的作用就是在 QImage 上进行绘制,并将该图像用作纹理。除非您的 UI 已经使用了 Qt Quick 2,否则这将是一个相当无意义的练习。 - Kuba hasn't forgotten Monica
1
嗯...是的,这就是为什么我特别提到使用Qt Quick。你知道,人们有不同的答案而不用称呼它们为毫无意义的练习也是可以的。不安全感吗? - Mitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接