16

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

谢谢。

4

5 回答 5

13

从 cairo 1.17.8 开始,Qt 支持将被移除 upstream

旧答案

最新版本的 cairo 通过允许绘制到创建的表面来支持 Qt :您可以在此处cairo_qt_surface_create(QPainter *painter)检查相关的头文件。没有文档,因为此功能仍处于试验阶段且默认禁用(您应该自己编译 cairo,明确启用 Qt 支持,使用.configure --enable-qt

于 2009-10-29T23:52:55.977 回答
8

Qt 的 Paint System是一个非常好的绘图库,并且基于矢量的。它已经在那里了。如果您选择 Qt 作为您的 GUI 工具包,它就再简单不过了。

于 2009-10-29T02:03:38.843 回答
4

警告:这不会是您正在寻找的答案。

你确定要这个吗?达到什么目的?这是关于写一个QPaintDevice基于开罗的吗?Qt 实现了自己的图形基元,Cairo 也是如此。我能看到的唯一原因是您不希望 Qt 的沉重层干扰您的系统(嵌入式?)。就像您正在尝试使用 Cairo 的 DirectFB 后端一样——但是还有 Qt-on-DirectFB 之类的东西。但是,请注意,如果没有自己的一组夸克(例如库互操作问题、从基于 Cairo 的上下文打印等),这种实现成本高昂且并非免费。我建议您在 Google 上进行定期搜索,以确定这些努力是否/曾经进行过并在尝试相同之前非常权衡利弊。

于 2009-10-28T20:57:02.583 回答
1

可以通过这种肮脏的方式来实现:

  1. 创建一个 cairo 图像表面,在该表面上绘制。
  2. 调用 cairo_image_surface_get_data() 获取像素。
  3. 将图像复制到 Qt 小部件。
于 2014-05-07T12:30:37.470 回答
1

这是如何完成的示例:

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)
于 2021-05-13T20:53:44.723 回答