无法在Gtk绘图区绘制开罗

Unable to paint on Gtk drawing_area with Cairo

本文关键字:绘制 绘图区 Gtk      更新时间:2023-10-16

我正试图用cairoGtkdrawing_area上绘制一个点。我有两个函数,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);    
}

现在,每当用户单击drawing_area时,就会调用drawPoint函数。

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;
}

但在打印了xy的值后,程序因分段故障而终止。

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff74ac3ae in cairo_set_source_rgb ()

是什么原因造成的?我的操作是否正确?

很难阅读代码(有破损的缩进,只提供了片段(,但需要注意的是:

  • button-press-event处理程序签名不正确。cairo上下文不存在
  • 绘图只能在GtkDrawingArea的draw信号处理程序内部进行。Cairo并不是按按钮绘制的:用户交互应该改变应用程序的状态,绘制处理程序应该根据当前应用程序状态进行绘制
  • CCD_ 13处理程序连接在CCD_ 14内部。这听起来很不对

我建议您尝试阅读DrawingArea文档,从它给出的简单示例开始,然后在可行时开始添加更复杂的内容。