c++ - QT - 不同用途的最佳绘画 "canvas"

标签 c++ qt graphics

我正在编写我的学士论文应用程序,将有三种不同类型的绘图。我需要渲染/绘制/绘制分形结构:

  1. 迭代功能系统(画线或简单路径,复制绘图(或其中的一部分),对拷贝进行一些转换并迭代绘制)
  2. 逃逸时间算法(遍历 Canvas 的每个像素,计算其颜色并为其中的像素着色)
  3. Elliot 波浪样本(通过给定点的路径 - 时间序列图;图表将由许多点组成并且无法显示在屏幕上,因此我需要一些简单的移动控制(带有点击事件的两个按钮是够好了))

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

我找到了这些:

  1. Qt Graphics View Framework(我觉得,这个太“重”了)
  2. 绘制到像素图中
  3. 继承 widget 并覆盖 paintEvent(如 Qt 的基本绘图示例中所示)
  4. Qt Quick的Qt Canvas(但我对此一无所知)

我应该选择其中一些选项还是其他选项?
非常感谢,你会很有帮助。

最佳答案

关于 1. QPainter 在任何东西(小部件、像素图、打印机......)上都是一个简单的选择。

关于 2. 在 QImage 中处理像素,然后在 painter 上绘制图像。

关于 3. 在小部件上绘画就足够了。您可以将小部件基于 QAbstractScrollArea

Graphics View Framework 的最大亮点是与场景中的项目的交互性。它让生活变得更轻松,并且应该被用来发挥自己的优势。

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

对于平移/缩放,如果您没有简单的方法来迭代要绘制的项目的子集,那么您应该只使用图形 View 。 “困难”但通用的方法是使用 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 操作。

关于c++ - QT - 不同用途的最佳绘画 "canvas",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22868642/

相关文章:

c++ - 警告 C4003 : not enough actual parameters for macro 'min'

c++ - 如何在不结束螺旋而不是盘旋的情况下提高 Sprite 速度

c++ - 可能的 Qt5 错误 : calling setFixedSize() disables the main window's close button (under Win7)

qt - 如何在 Loader 的项目中正确连接信号?

c++ - 需要帮助将两个 STL 映射合并为一个(map<char,string> 和 map<string,int> 到 map<char,map<string,int>>)

c++ - 对象数组作为链表中的字符数组——我关于对齐的假设是否有效?

c++ - 在 Clion 中使用 Qt

java - 如何在主循环中实现 Graphics 类?

r - R 中的自定义热图

java - 计算直线与 x 轴之间的角度