Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.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++ Cairo与Qt集成_C++_Qt_Integration_Cairo - Fatal编程技术网

C++ Cairo与Qt集成

C++ Cairo与Qt集成,c++,qt,integration,cairo,C++,Qt,Integration,Cairo,我想使用带有Qt的Cairo图形库,但找不到任何文档。我只想制作带有Qt的GUI,并使用Cairo在Qt窗口中绘制图形 谢谢。注意:这不是你想要的答案 你确定要这个吗?为了什么?这是关于基于Cairo编写QPaintDevice?Qt实现了自己的图形原语,Cairo也是如此。我能看到的唯一原因是,您不希望Qt的厚层干扰您的系统(嵌入式?)。这就像你试图使用Cairo的DirectFB后端一样——但是DirectFB上还有类似Qt的东西。但是,请注意,如果没有自己的一组Quark(如库互操作问题)

我想使用带有Qt的Cairo图形库,但找不到任何文档。我只想制作带有Qt的GUI,并使用Cairo在Qt窗口中绘制图形

谢谢。

注意:这不是你想要的答案


你确定要这个吗?为了什么?这是关于基于Cairo编写
QPaintDevice
?Qt实现了自己的图形原语,Cairo也是如此。我能看到的唯一原因是,您不希望Qt的厚层干扰您的系统(嵌入式?)。这就像你试图使用Cairo的DirectFB后端一样——但是DirectFB上还有类似Qt的东西。但是,请注意,如果没有自己的一组Quark(如库互操作问题),这样的实现成本高昂且不是免费的,从这个基于开罗的环境中打印等。我建议你定期在谷歌上搜索一下,看看这些努力是否正在/曾经在进行,并在尝试之前仔细权衡利弊。

是一个非常好的绘图库,是基于向量的。它已经在那里了。如果您选择Qt作为GUI工具包,它将变得非常简单。

从cairo 1.17.8开始,Qt支持

旧答案
cairo的最新版本通过允许绘制到使用
cairo\u Qt\u surface\u create(QPainter*painter)
创建的曲面来支持Qt:您可以检查相关的头文件。没有文档,因为此功能仍然是实验性的,默认情况下处于禁用状态(您应该自己编译cairo,使用
configure--enable Qt
明确地启用Qt支持。可以通过以下方式实现:

  • 创建一个cairo图像曲面,在该曲面上绘制
  • 调用cairo\u image\u surface\u get\u data()获取像素
  • 将图像复制到Qt小部件

  • 下面是一个如何实现的示例:

    class CairoWidget: public QWidget
    {
    public:
      using QWidget::QWidget;
    
    private:
      void paintEvent(QPaintEvent*)
      {
        auto const w(width()), h(height());
        QImage image(w, h, QImage::Format_RGB32);
    
        auto const surf(cairo_image_surface_create_for_data(image.bits(),
          CAIRO_FORMAT_RGB24, w, h, image.bytesPerLine()));
        auto const cr(cairo_create(surf));
        cairo_surface_destroy(surf);
    
        //
        cairo_set_source_rgb(cr, 1, 1, 1);
        cairo_paint(cr);
        cairo_scale(cr, w, h);
    
        //
        cairo_set_source_rgb(cr, 0, 0, 0);
        cairo_move_to(cr, 0, 0);
        cairo_line_to(cr, 1, 1);
        cairo_move_to(cr, 1, 0);
        cairo_line_to(cr, 0, 1);
        cairo_set_line_width(cr, .2);
        cairo_stroke(cr);
    
        cairo_rectangle(cr, 0, 0, .5, .5);
        cairo_set_source_rgba(cr, 1, 0, 0, .80);
        cairo_fill(cr);
    
        cairo_rectangle(cr, 0, .5, .5, .5);
        cairo_set_source_rgba(cr, 0, 1, 0, .60);
        cairo_fill(cr);
    
        cairo_rectangle(cr, .5, 0, .5, .5);
        cairo_set_source_rgba(cr, 0, 0, 1, .40);
        cairo_fill(cr);
    
        cairo_destroy(cr);
    
        //
        QPainter p(this);
        p.drawImage(0, 0, image);
      }
    };
    
    int main(int argc, char* argv[])
    {
      QApplication app(argc, argv);
    
      CairoWidget w;
      w.show();
    
      return app.exec();
    }
    
    您还可以尝试其他黑客攻击,例如直接将图像绘制到备份存储中,或者您也可以从自己的缓冲区初始化
    QImage
    ,这对于
    cairo
    QWidget
    更为可取:

    QImage::QImage(const uchar *data, int width, int height, int bytesPerLine, QImage::Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr)
    

    谢谢你的回答。我只想要一个简单的图形库和一个GUI库,可以很容易地一起工作,我不想使用GUI库函数来绘图,我喜欢Cairo,因为它使用简单,并且是基于向量的。也许你可以给我推荐另一个GUI库。这是我不理解的部分,你为什么不想和我们一起使用呢e Qt?也许,我们可以建议一种替代方案。Qt不仅仅是GUI。图形库的抽象级别低于GUI库。嗯,你在后退一步。GTK+是另一个这样的GUI库(具有Cairo后端)。我将尝试使用Qt图形功能。我尝试过GTK,但在项目中使用它是一件痛苦的事情。有时我们编写的程序本应仅用于Qt的内部工具,而其他程序仅基于cairo。这就是为什么人们可能需要在Qt制作的UI小部件中使用cairo进行绘制的原因。我肯定会尝试,我真的希望它能工作,因为没有我正在尝试GTK,它不如QT那么好。如果你使用C++,我认为你会更舒服地使用,而不是普通的GTK+ ITSITY。QT和QPainter,GTK+和开罗,GTKMM和CAIROMM以及任何有效的混合……根据你想要的,它们都是有效的选项。@ AMC是不正确的。大多数的油漆设备是基于光栅的,但是:例如,.QPainterAPI本身主要由基于向量的操作组成。它不仅仅是一个blitter。