Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C GTK3开罗g_信号连接:不明白重点_C_Gtk3 - Fatal编程技术网

C GTK3开罗g_信号连接:不明白重点

C GTK3开罗g_信号连接:不明白重点,c,gtk3,C,Gtk3,我正试图解决这个问题,当我点击“按钮1”时,会调用“on_draw_event”函数(该函数有效),并且在我的“darea”绘图区域中会显示一条线(该函数无效) 这是我的密码: #include <gtk/gtk.h> static gboolean on_draw_event(GtkWidget *button, cairo_t *darea) { printf ("function: on_draw_event\n"); cairo_set_source

我正试图解决这个问题,当我点击“按钮1”时,会调用“on_draw_event”函数(该函数有效),并且在我的“darea”绘图区域中会显示一条线(该函数无效)

这是我的密码:

    #include <gtk/gtk.h>

static gboolean on_draw_event(GtkWidget *button, cairo_t *darea)
{
    printf ("function: on_draw_event\n");
    cairo_set_source_rgb(darea, 0, 255, 0);
    cairo_set_line_width(darea, 0.5);

    cairo_move_to(darea, 0, 100);
    cairo_line_to(darea, 400, 100);
    cairo_stroke(darea);
    return FALSE;
}


int main (int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *darea;
    GtkWidget *myGrid;
    GtkWidget *button1;
    GtkWidget *button2;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_POPUP);
    myGrid = gtk_grid_new ();
    darea = gtk_drawing_area_new();

    gtk_widget_set_size_request(darea, 400, 400);
    button1 = gtk_button_new_with_label ("BUTTON 1");
    button2 = gtk_button_new_with_label ("QUIT");

    gtk_grid_attach(GTK_GRID(myGrid), button1, 0, 0, 1, 1);
    gtk_grid_attach(GTK_GRID(myGrid), darea, 0, 1, 1, 1);
    gtk_grid_attach(GTK_GRID(myGrid), button2, 0, 2, 1, 1);
    gtk_container_add(GTK_CONTAINER(window), myGrid);

    g_signal_connect(G_OBJECT(button2), "clicked", G_CALLBACK(gtk_main_quit), NULL);
    g_signal_connect(button1, "clicked", G_CALLBACK(on_draw_event), darea);

    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

    gtk_widget_show_all(window);

    gtk_main();

    return 0;
}
#包括
静态gboolean on_draw_事件(GtkWidget*按钮,cairo_t*darea)
{
printf(“函数:在绘图事件上”);
cairo\u set\u source\u rgb(darea,0,255,0);
cairo_集_线_宽(darea,0.5);
开罗(darea,0100);
开罗线(darea,400100);
开罗(darea),;
返回FALSE;
}
int main(int argc,char*argv[])
{
GtkWidget*窗口;
GtkWidget*darea;
GtkWidget*myGrid;
GtkWidget*按钮1;
GtkWidget*按钮2;
gtk_init(&argc,&argv);
window=gtk_window_new(gtk_window_弹出窗口);
myGrid=gtk_grid_new();
darea=gtk_图纸_区域_新();
gtk_widget_set_size_request(darea,400400);
button1=gtk_按钮_新按钮_带_标签(“按钮1”);
button2=gtk_按钮_新建_,带_标签(“退出”);
gtk_网格连接(gtk_网格(myGrid)),按钮1,0,0,1,1;
gtk_网格连接(gtk_网格(myGrid),darea,0,1,1,1);
gtk_网格连接(gtk_网格(myGrid))按钮2、0、2、1、1;
gtk_容器添加(gtk_容器(窗口),myGrid);
g_信号连接(g_对象(按钮2),“单击”,g_回调(gtk_主按钮退出),空);
g_信号连接(按钮1,“点击”,g_回调(在绘图事件上),darea);
gtk_窗口设置位置(gtk_窗口(窗口)、gtk_WIN_位置中心);
gtk_小部件_全部显示(窗口);
gtk_main();
返回0;
}
如果我能 “g_信号连接(按钮1,“点击”,g_回调(在绘图事件中),darea);” 到 “g_信号连接(g_对象(darea),“绘制”,g_回调(在绘制事件上),NULL)” 这条线将被绘制,但我希望它等待我的按钮点击。希望有人能阻止我,这不是个大问题


谢谢。

如前所述,您的示例崩溃,因为您正在将图形回调连接到单击的
信号。调用时,回调会得到无意义的参数并终止

要“等待按钮单击”,请引入一个标志,告诉您是否已单击按钮。在绘制事件的
中查阅该标志,并在按钮的
单击的
回调中设置该标志

为实现上述功能而修改的示例如下所示:

#include <gtk/gtk.h>

static gboolean on_draw_event(GtkWidget *darea, cairo_t *cr,
                              gboolean *draw_line)
{
    if (!*draw_line)
        return FALSE;
    printf ("function: on_draw_event\n");
    cairo_set_source_rgb(cr, 0, 255, 0);
    cairo_set_line_width(cr, 0.5);

    cairo_move_to(cr, 0, 100);
    cairo_line_to(cr, 400, 100);
    cairo_stroke(cr);
    return FALSE;
}

static void on_button1_clicked(GtkWidget *button, gboolean *draw_line)
{
    *draw_line = TRUE;
    /* Make sure the widget is repainted after the click.
       gtk_widget_queue_draw() should better be invoked with just the
       drawing area, but this code accesses the common parent for
       simplicity. Passing darea in a struct whose address is provided as
       user_data (along with gboolean *draw_line) is left as exercise. */
    gtk_widget_queue_draw(gtk_widget_get_parent(button));
}


int main (int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *darea;
    GtkWidget *myGrid;
    GtkWidget *button1;
    GtkWidget *button2;
    gboolean draw_line = FALSE;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_POPUP);
    myGrid = gtk_grid_new ();
    darea = gtk_drawing_area_new();

    gtk_widget_set_size_request(darea, 400, 400);
    button1 = gtk_button_new_with_label ("BUTTON 1");
    button2 = gtk_button_new_with_label ("QUIT");

    gtk_grid_attach(GTK_GRID(myGrid), button1, 0, 0, 1, 1);
    gtk_grid_attach(GTK_GRID(myGrid), darea, 0, 1, 1, 1);
    gtk_grid_attach(GTK_GRID(myGrid), button2, 0, 2, 1, 1);
    gtk_container_add(GTK_CONTAINER(window), myGrid);

    g_signal_connect(G_OBJECT(button2), "clicked", G_CALLBACK(gtk_main_quit), NULL);
    g_signal_connect(button1, "clicked", G_CALLBACK(on_button1_clicked), &draw_line);
    g_signal_connect(G_OBJECT(darea), "draw", G_CALLBACK(on_draw_event), &draw_line);

    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

    gtk_widget_show_all(window);

    gtk_main();

    return 0;
}
#包括
静态gboolean on_draw_事件(GtkWidget*darea、cairo_t*cr、,
gboolean*绘制线)
{
如果(!*画线)
返回FALSE;
printf(“函数:在绘图事件上”);
cairo\u set\u source\u rgb(cr,0,255,0);
cairo_集_线_宽(cr,0.5);
开罗移动到(cr,0,100);
开罗线(cr,400100);
脑卒中(cr);
返回FALSE;
}
单击按钮1上的静态空白(GtkWidget*按钮,gboolean*绘制线)
{
*绘制线=真;
/*确保在单击后重新绘制小部件。
gtk_widget_queue_draw()最好只使用
绘图区域,但此代码访问的是
简单性:在地址提供为
用户数据(连同gboolean*绘制线)留作练习*/
gtk_小部件_队列_绘制(gtk_小部件_获取_父项(按钮));
}
int main(int argc,char*argv[])
{
GtkWidget*窗口;
GtkWidget*darea;
GtkWidget*myGrid;
GtkWidget*按钮1;
GtkWidget*按钮2;
gboolean draw_line=FALSE;
gtk_init(&argc,&argv);
window=gtk_window_new(gtk_window_弹出窗口);
myGrid=gtk_grid_new();
darea=gtk_图纸_区域_新();
gtk_widget_set_size_request(darea,400400);
button1=gtk_按钮_新按钮_带_标签(“按钮1”);
button2=gtk_按钮_新建_,带_标签(“退出”);
gtk_网格连接(gtk_网格(myGrid)),按钮1,0,0,1,1;
gtk_网格连接(gtk_网格(myGrid),darea,0,1,1,1);
gtk_网格连接(gtk_网格(myGrid))按钮2、0、2、1、1;
gtk_容器添加(gtk_容器(窗口),myGrid);
g_信号连接(g_对象(按钮2),“单击”,g_回调(gtk_主按钮退出),空);
g_信号连接(按钮1,“点击”,g_回调(按钮1上点击),并绘制线);
g_信号连接(g_对象(darea),“绘制”,g_回调(在绘制事件上)和绘制线);
gtk_窗口设置位置(gtk_窗口(窗口)、gtk_WIN_位置中心);
gtk_小部件_全部显示(窗口);
gtk_main();
返回0;
}

非常感谢,它工作得非常完美,现在我知道如何处理这个问题了。我想给你看我的新代码,但我不知道怎么做。我可以写这篇评论。只是一个小失误,只是“返回”不起作用。我改为“return FALSE”。@Arcanix显示代码,你可以上传到并在评论中发布简短的url。我已将答案修改为返回
FALSE
,感谢您的更正。谢谢您的提示。你可以在这里找到我的新代码:我知道这不是最好的代码,但它可以工作。我还没有使用struct,但我会在我的下一个项目中更多地使用它。@user\u data
的Arcanix地址应该作为“user data”参数从
main
传递到
g\u signal\u connect
,而不是作为全局变量保存。在这个简单的示例中,全局变量将起作用,但是如果您希望,例如,实例化两个这样的小部件,它将阻碍可重用性…再次非常感谢您!现在我想我已经按照你说的那样修好了。现在的问题是,我有两个功能来上下移动队列(在按钮上单击)和(在按钮上单击)。有没有提示我如何在一个函数中解决这个问题?