我想在Qt中使用Cairo图形库,但找不到任何文档。我只是想使用Qt制作GUI,并在Qt窗口中使用Cairo进行图形绘制。
谢谢。
我想在Qt中使用Cairo图形库,但找不到任何文档。我只是想使用Qt制作GUI,并在Qt窗口中使用Cairo进行图形绘制。
谢谢。
Qt的绘图系统是一个非常好的绘图库,它是基于矢量的。而且它已经存在了。如果你选择Qt作为你的GUI工具包,那么就再也没有更简单的了。
QPaintDevice
吗?Qt已经实现了自己的图形原语,同样的,Cairo也有。我唯一能看到的理由是你不想让Qt的重量级层干扰你的系统(嵌入式?)。这就好像你试图使用Cairo的DirectFB后端,但是还有像运行在DirectFB上的Qt等其他问题。然而,需要注意的是,这样的实现是昂贵的,并且不是免费的,其本身也存在一些缺陷,例如库交互性问题、从此基于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)