gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:25:44 29 4
gpt4 key购买 nike

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

  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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com