我试图用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 ()
是什么原因造成的?我是否正确进行?
最佳答案
很难阅读代码(缩进时断断续续,仅提供摘要),但需要注意一些事项:button-press-event
处理程序签名不正确。开罗上下文不存在。
绘制仅应在GtkDrawingArea的draw
信号处理程序内进行。按下按钮进行绘制的想法并非开罗如何工作:用户交互应更改应用程序的状态,绘制处理程序应根据当前应用程序状态进行绘制。button-press-event
处理程序连接在drawPoint ()
内部。这听起来很错误。
我建议您尝试阅读DrawingArea docs并从它提供的简单示例开始,然后在可行时开始添加更复杂的内容。
关于c++ - 无法使用开罗在Gtk drawing_area上绘画,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25076604/