Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QT-最佳绘画作品“;帆布“;为了不同的目的_C++_Qt_Graphics - Fatal编程技术网

C++ QT-最佳绘画作品“;帆布“;为了不同的目的

C++ QT-最佳绘画作品“;帆布“;为了不同的目的,c++,qt,graphics,C++,Qt,Graphics,我正在编写我的学士学位论文申请,将有三种不同类型的图纸。我需要渲染/绘制/绘制由以下人员制作的分形结构: 迭代函数系统(绘制直线或简单路径,复制图形(或部分图形),使用副本进行一些转换,然后迭代绘制) 逃逸时间算法(遍历画布的每个像素,计算其颜色,并在画布中为像素着色) Elliot waves示例(通过给定点的路径-时间序列图;该图将由多个点组成,无法显示在屏幕上,因此我需要一些简单的移动控制(两个带有单击事件的按钮就足够了)) 现在,我的问题是,你能推荐一些适合我的目的的Qt方法吗(如果可能

我正在编写我的学士学位论文申请,将有三种不同类型的图纸。我需要渲染/绘制/绘制由以下人员制作的分形结构:

  • 迭代函数系统(绘制直线或简单路径,复制图形(或部分图形),使用副本进行一些转换,然后迭代绘制)
  • 逃逸时间算法(遍历画布的每个像素,计算其颜色,并在画布中为像素着色)
  • Elliot waves示例(通过给定点的路径-时间序列图;该图将由多个点组成,无法显示在屏幕上,因此我需要一些简单的移动控制(两个带有单击事件的按钮就足够了))
  • 现在,我的问题是,你能推荐一些适合我的目的的Qt方法吗(如果可能的话,最简单的方法)?

    我发现了这些:

  • Qt图形视图框架(我认为,这太“沉重”)
  • 绘制到pixmap中
  • 继承小部件并覆盖paintEvent(如Qt的基本绘图示例所示)
  • Qt Quick的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。你知道,人们可以有不同于你自己的答案,而不称他们为无意义的练习。不安全感,有人吗?