C++ Cairo与Qt集成
我想使用带有Qt的Cairo图形库,但找不到任何文档。我只想制作带有Qt的GUI,并使用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(如库互操作问题)
你确定要这个吗?为了什么?这是关于基于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支持。可以通过以下方式实现:
下面是一个如何实现的示例:
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。