我试图在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
但是在打印y
和Program received signal SIGSEGV, Segmentation fault.
0x00007ffff74ac3ae in cairo_set_source_rgb ()
的值后,程序会终止并出现分段错误。
{{1}}
可能导致这种情况的原因是什么?我正确地进行了吗?
答案 0 :(得分:1)
很难阅读代码(缩进缩进并仅提供片段),但有些注意事项:
button-press-event
处理程序签名不正确。 cairo背景不存在。draw
信号处理程序中仅 。按下按钮的想法不是开罗的工作方式:用户交互应该改变应用程序的状态,draw-handler应该根据当前的应用程序状态进行绘制。button-press-event
处理程序连接在drawPoint ()
内。这听起来很不对。我建议您尝试阅读DrawingArea docs并从它给出的简单示例开始,然后在有效的时候开始添加更复杂的内容。