我正在编写我的学士学位论文申请程序,将有三种不同类型的绘图。我需要绘制/绘制/绘制由以下内容组成的分形结构:
现在,我的问题是,您能否推荐一些适合我的Qt方法(如果可能的话,最简单的方法)?
我找到了这些:
我应该选择这些选项中的一些或者其他什么吗?
非常感谢,你会很有帮助的。
发布于 2014-04-06 06:34:27
关于任何东西(小部件、像素映射、打印机、.)上的QPainter是个简单的选择。
对QImage中的像素进行处理,然后在画家上绘制图像。
在小部件上进行绘画就足够了。您可以将小部件建立在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:
...
};然后,您可以在一个通用小部件中使用它:
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操作。
发布于 2014-04-04 17:09:45
关于最近的一些替代方案,请参阅我的答案这里。我建议在QQuickPaintedItem中使用QtQuick,因为它提供了熟悉的QPainter API,最好使用C++描述的操作类型。
有关QPainter API的信息,请参阅绘画实例和基本绘图基本绘图示例。
https://stackoverflow.com/questions/22868642
复制相似问题