C++ QT-最佳绘画作品“;帆布“;为了不同的目的
我正在编写我的学士学位论文申请,将有三种不同类型的图纸。我需要渲染/绘制/绘制由以下人员制作的分形结构:C++ QT-最佳绘画作品“;帆布“;为了不同的目的,c++,qt,graphics,C++,Qt,Graphics,我正在编写我的学士学位论文申请,将有三种不同类型的图纸。我需要渲染/绘制/绘制由以下人员制作的分形结构: 迭代函数系统(绘制直线或简单路径,复制图形(或部分图形),使用副本进行一些转换,然后迭代绘制) 逃逸时间算法(遍历画布的每个像素,计算其颜色,并在画布中为像素着色) Elliot waves示例(通过给定点的路径-时间序列图;该图将由多个点组成,无法显示在屏幕上,因此我需要一些简单的移动控制(两个带有单击事件的按钮就足够了)) 现在,我的问题是,你能推荐一些适合我的目的的Qt方法吗(如果可能
我发现了这些:
非常感谢您,您将非常有帮助。查看我的答案,了解最近的一些备选方案。我建议使用Qt QuaskOffice,因为它提供了熟悉的QGeisher API,最好是在C++中描述您所描述的操作类型。
有关QPainter API的信息,请参阅和有关基本图纸的。Re 1<代码>QPainter对任何东西(小部件、pixmap、打印机等)都是一个简单的选择 Re 2。在
QImage
中处理像素,然后在画师上绘制图像
Re 3。在小部件上绘制就足够了。您可以将小部件基于QAbstractScrollArea
图形视图框架的最大优点是与场景中的项目交互。它使生活变得更容易,并且应该被用来为一个人的利益
如果您的视图是非交互式的,那么唯一的好处就是二进制空间分区索引,它可以剔除进行部分更新或放大时进行更新所需的工作量。除非您允许放大/平移,或者进行部分更改,否则这是毫无意义的,因为Qt窗口是双缓冲的,并且您基本上从不进行部分绘制。对于部分更改,更改的项目需要重新编制索引,除非其几何图形保持不变
使用平移/缩放时,如果没有简单的方法迭代要绘制的项目子集,则应仅使用图形视图。“硬”但通用的方法是使用BSP索引,图形视图系统提供了这一点。我认为在您的例子中,迭代给定场景矩形中的项目/基本体应该很容易
对于使用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)
{}
};
class RenderableVisualizer:publicqwidget{
q共享指针m_可渲染;
无效油漆事件(QPaintEvent*ev){
油漆工(本);
m_renderable->render(画师,rect());
}
公众:
渲染器(
QSharedPointer可渲染,QWidget*parent=0
):QWidget(父),m_renderable(renderable)
{}
};
这种方法可以扩展为向
RenderableVisualizer
添加一个选项,以拥有一个本地备份存储,并从一个单独的线程对其进行渲染。如果渲染时间过长,它将提供更平滑的GUI操作。谢谢您的回答。我试图寻找一些教程或示例,但没有找到任何有用的。难道你不知道什么是偶然的吗?只是简单的画一条线的例子,一些简单的转换或者我可以从什么开始?感谢绘画的文档相当好;我添加了两个与您相关的链接。QQuickPaintedItem
只需在QImage
上绘制,并将该图像用作纹理。这将是一个毫无意义的练习,除非你的UI的其他部分已经在使用QtQuick2了。嗯。。。是的,这就是为什么我特别提到使用Qt-Quick。你知道,人们可以有不同于你自己的答案,而不称他们为无意义的练习。不安全感,有人吗?