我正在编写我的学士论文申请表,将有三种不同类型的图纸.我需要渲染/绘制/绘制分形结构:
现在,我的问题是,你能推荐一些适合我目的的Qt方法(最简单的方法,如果可能的话)?
我找到了这些:
我应该选择其中一些选项还是其他什么?
非常感谢,你会非常乐于助人.
Re 1. QPainteron任何东西(小部件,像素图,打印机......)是一个简单的选择.
Re 2.处理像素QImage,然后在画家上绘制图像.
Re 3.在小部件上绘画就足够了.您可以基于您的小部件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:
...
};
Run Code Online (Sandbox Code Playgroud)
然后,您可以在通用小部件中使用它:
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)
{}
};
Run Code Online (Sandbox Code Playgroud)
可以扩展此方法以添加选项以RenderableVisualizer具有本地后备存储并从单独的线程呈现给它.如果渲染很漫长,它将提供更平滑的GUI操作.