无法在开罗的Gtk drawing_area上绘画

时间:2014-08-01 09:04:50

标签: c++ gtk cairo

我试图在drawing_area Gtk cairo上点do_drawing。 我有两个函数,draw函数用于绘制do_drawPoint信号的背景,第二个函数void painter::do_drawing(cairo_t *cr) { cairo_set_source_rgb(cr, 1, 1, 1); cairo_paint(cr); } void painter::do_pointDraw(cairo_t *cr) { cairo_set_source_rgb(cr, 0, 0, 0); cairo_arc(cr, 150, 150, 10, 0, 2 * M_PI); cairo_fill(cr); } 用于绘制点。

drawPoint

现在,只要用户点击drawing_area,就会调用void drawingArea::drawPoint() { g_signal_connect(area, "button-press-event", G_CALLBACK(clicked), NULL); std::cout<<"drawPoint"<<std::endl; } gboolean clicked(GtkWidget *widget, GdkEventButton *event, cairo_t *cr, gpointer user_data) { if (event->button == 1) { x = event->x; y = event->y; } std::cout<<x<<" and "<<y<<std::endl; ptr->do_pointDraw(cr); gtk_widget_queue_draw(widget); } return TRUE; } 函数。

x

但是在打印yProgram received signal SIGSEGV, Segmentation fault. 0x00007ffff74ac3ae in cairo_set_source_rgb () 的值后,程序会终止并出现分段错误。

{{1}}

可能导致这种情况的原因是什么?我正确地进行了吗?

1 个答案:

答案 0 :(得分:1)

很难阅读代码(缩进缩进并仅提供片段),但有些注意事项:

  • button-press-event处理程序签名不正确。 cairo背景不存在。
  • 绘图应该在GtkDrawingArea的draw信号处理程序中仅 。按下按钮的想法不是开罗的工作方式:用户交互应该改变应用程序的状态,draw-handler应该根据当前的应用程序状态进行绘制。
  • button-press-event处理程序连接在drawPoint ()内。这听起来很不对。

我建议您尝试阅读DrawingArea docs并从它给出的简单示例开始,然后在有效的时候开始添加更复杂的内容。