gpt4 book ai didi

c++ - 无法使用 Cairo 在 Gtk drawing_area 上绘画

转载 作者:行者123 更新时间:2023-11-28 06:45:33 24 4
gpt4 key购买 nike

我正在尝试使用 cairoGtk 中的 drawing_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 处理程序签名不正确。开罗语境不存在。
  • 绘图应该发生在GtkDrawingArea 的draw 信号处理程序中。按下按钮时绘制的想法并不是 Cairo 的工作方式:用户交互应该改变应用的状态,绘制处理程序应该根据当前的应用状态进行绘制。
  • button-press-event 处理程序在 drawPoint () 中连接。这听起来很不对。

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com