我试图用drawing_areaGtk中的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;
}


但是在打印xy的值后,程序会因分段错误而终止。

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


是什么原因造成的?我是否正确进行?

最佳答案

很难阅读代码(缩进时断断续续,仅提供摘要),但需要注意一些事项:


button-press-event处理程序签名不正确。开罗上下文不存在。
绘制仅应在GtkDrawingArea的draw信号处理程序内进行。按下按钮进行绘制的想法并非开罗如何工作:用户交互应更改应用程序的状态,绘制处理程序应根据当前应用程序状态进行绘制。
button-press-event处理程序连接在drawPoint ()内部。这听起来很错误。


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

关于c++ - 无法使用开罗在Gtk drawing_area上绘画,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25076604/

10-11 18:48