首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QT -不同用途的最佳油画“画布”

QT -不同用途的最佳油画“画布”
EN

Stack Overflow用户
提问于 2014-04-04 16:54:01
回答 2查看 13.7K关注 0票数 6

我正在编写我的学士学位论文申请程序,将有三种不同类型的绘图。我需要绘制/绘制/绘制由以下内容组成的分形结构:

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

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

我找到了这些:

  1. Qt图形视图框架(我认为这太“重”了)
  2. 绘制到像素图中
  3. 继承小部件并重写paintEvent (如Qt的基本绘图示例所示)
  4. Quick画布(但我对此一无所知)

我应该选择这些选项中的一些或者其他什么吗?

非常感谢,你会很有帮助的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-06 06:34:27

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

QImage中的像素进行处理,然后在画家上绘制图像。

在小部件上进行绘画就足够了。您可以将小部件建立在QAbstractScrollArea上。

图形视图框架的最大要点是与场景中的项进行交互。这样的话,生活就容易多了,而且应该被用来占便宜。

如果您的视图是非交互式的,那么唯一的好处是二进制空间分区索引,该索引在放大时选择执行部分更新或更新所需的工作量。除非允许缩放/平移,或者进行部分更改,否则这是没有意义的,因为Qt窗口是双缓冲的,而且本质上从来不进行部分绘制。对于部分更改,需要重新编制更改项的索引,除非它们的几何形状保持不变。

对于摇摄/缩放,只有在没有轻松迭代要绘制的项子集的方法时,才应该使用图形视图。“难”但一般的方法是有一个BSP索引,而Graphics View系统提供了这一点。我认为在您的例子中,应该很容易迭代位于给定场景矩形中的项/原语。

对于使用QPainter进行绘图,您所画的内容并不重要,这是一个次要的细节。您可以将绘图分解到包含需要绘制的数据的类中,例如:

代码语言:javascript
复制
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:
  ...
};

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

代码语言:javascript
复制
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操作。

票数 5
EN

Stack Overflow用户

发布于 2014-04-04 17:09:45

关于最近的一些替代方案,请参阅我的答案这里。我建议在QQuickPaintedItem中使用QtQuick,因为它提供了熟悉的QPainter API,最好使用C++描述的操作类型。

有关QPainter API的信息,请参阅绘画实例和基本绘图基本绘图示例

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22868642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档