我想在 Qt 中使用 Cairo 图形库,但我找不到任何文档。我只想用 Qt 制作 GUI,并使用 Cairo 在 Qt 窗口中绘制图形。
谢谢。
我想在 Qt 中使用 Cairo 图形库,但我找不到任何文档。我只想用 Qt 制作 GUI,并使用 Cairo 在 Qt 窗口中绘制图形。
谢谢。
从 cairo 1.17.8 开始,Qt 支持将被移除 upstream。
最新版本的 cairo 通过允许绘制到创建的表面来支持 Qt :您可以在此处cairo_qt_surface_create(QPainter *painter)
检查相关的头文件。没有文档,因为此功能仍处于试验阶段且默认禁用(您应该自己编译 cairo,明确启用 Qt 支持,使用.configure --enable-qt
Qt 的 Paint System是一个非常好的绘图库,并且是基于矢量的。它已经在那里了。如果您选择 Qt 作为您的 GUI 工具包,它就再简单不过了。
警告:这不会是您正在寻找的答案。
你确定要这个吗?达到什么目的?这是关于写一个QPaintDevice
基于开罗的吗?Qt 实现了自己的图形基元,Cairo 也是如此。我能看到的唯一原因是您不希望 Qt 的沉重层干扰您的系统(嵌入式?)。就像您正在尝试使用 Cairo 的 DirectFB 后端一样——但是还有 Qt-on-DirectFB 之类的东西。但是,请注意,如果没有自己的一组夸克(例如库互操作问题、从基于 Cairo 的上下文打印等),这种实现成本高昂且并非免费。我建议您在 Google 上进行定期搜索,以确定这些努力是否/曾经进行过并在尝试相同之前非常权衡利弊。
可以通过这种肮脏的方式来实现:
这是如何完成的示例:
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)